史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2009-08-01, 03:58 PM   #1
chung1206 帥哥
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設 疑問 - VB6.0載入圖片解析度限制

各位先進們好,想請教一下,我載入圖片至Image裡後存檔成jpg後,我的原圖解析度是300另存jpg檔後解析度變成70而且可以做一般瀏覽而已,無法使用photoshop開啟,但若存成bmp檔photoshop可以開啟,但解析度依然只有70而已,請問可以限制他載入的解析度大小嗎?謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-01, 08:59 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

不知道你的 jpg存檔函式(如何存檔的程式碼)是...?

DPI 是 像素/英吋
只是一個記錄於 jpg檔之檔頭上的資訊
要改變的話
只要將檔頭資訊取出,改變 XResolution、YResolution 兩個參數的值,再寫回檔頭便可以了

可以用二進位開檔方式將資訊取出
改寫後再寫回

檔案是以 十六進制 方式記載
位址在 第14+15位元組 及 第16+17位元組 上
比如 水平及垂直解析度都是96 dpi的話就是
第十四位元組 --> 00 60 00 60 <--第十七位元組

語法:
Private Sub Command3_Click()
Dim byteData(17) As Byte

    Open "r:\hh.jpg" For Binary Access Read As #1
    Get #1, , byteData()
    Close #1
    
    '將影像解析度改成 72 DPI
    byteData(15) = 72
    byteData(17) = 72
    
    Open "r:\hh.jpg" For Binary Access Write As #1
    Put #1, , byteData()
    Close #1
    Erase byteData

End Sub

此帖於 2009-08-02 10:37 AM 被 mini 編輯.
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
舊 2009-08-02, 12:33 AM   #3 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

我的存檔程式碼如下,請版大多多指教,謝謝。
語法:
Private Sub Command3_Click()
   Dim i As Integer, X As Long, Y As Long
   Picture1.AutoRedraw = True
   Picture1.Width = Image1(0).Width * 4
   Picture1.Height = Image1(0).Height * 2
   X = 0: Y = 0
   For i = 0 To 7
   If Image1(i).Picture = 0 Then
   Else
      Picture1.PaintPicture Image1(i).Picture, X, Y, Image1(i).Width, Image1(i).Height
   End If
      X = X + Image1(0).Width
      If i = 3 Then
         X = 0
         Y = Y + Image1(0).Height
      End If
   Next
   With CommonDialog2
        .FileName = ""
        .Filter = "JPEG files (*.jpg) |*.jpg|BMP files (*.bmp) |*.bmp"
        .ShowSave
    End With
    If CommonDialog2.FileName = "" Then Exit Sub
    SavePicture Picture1.Image, CommonDialog2.FileName
End Sub
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-02, 10:42 AM   #4 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

改成

語法:
   Dim sTmp As String
   With CommonDialog2
        .FileName = ""
        .Filter = "JPEG files (*.jpg) |*.jpg|BMP files (*.bmp) |*.bmp"
        .ShowSave
        If .FileName = "" Then Exit Sub
        
        sTmp = LCase(Right(.FileName,3)) '得到最右邊的副檔名並統一轉成小寫
             If sTmp = "bmp" Then
            SavePicture Picture1.Image, .FileName

        ElseIf sTmp = "jpg" Then
            SaveJPG Picture1.Image, .FileName, 100 '品質從1~100
            'SaveJPG 參考 http://forum.slime.com.tw/thread250858.html#post2179045
            '**圖像改解析度**
            Dim byteData(17) As Byte

            Open .FileName For Binary Access Read As #1
            Get #1, , byteData()
            Close #1
    
            '將影像解析度改成 300 dpi = 十六進制 01 2C
            byteData(14) = &H01
            byteData(15) = &H2C
            byteData(16) = &H01
            byteData(17) = &H2C
    
            Open .FileName For Binary Access Write As #1
            Put #1, , byteData()
            Close #1
            '**************
        EndIf
   End With
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
向 mini 送花的會員:
羅迪 (2009-09-19)
感謝您發表一篇好文章
舊 2009-08-02, 04:21 PM   #5 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

版大您好,如果我只要存成bmp檔就好dpi300這樣會不會比較簡單點?JPG的部份蠻複雜的,我真得看不太懂,謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-02, 04:43 PM   #6 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

引用:
作者: chung1206 查看文章
版大您好,如果我只要存成bmp檔就好dpi300這樣會不會比較簡單點?JPG的部份蠻複雜的,我真得看不太懂,謝謝。
根據 http://www.atlaspost.com/landmark-339129.htm 上的 Bitmap File Header
其水平與垂直解析度記載於
0026h H-Resolution 4 水平解析度(單位:像素/公尺)【註8】
002Ah V-Resolution 4 垂直解析度(單位:像素/公尺)
...
語法:
【註8】若要換算為 dpi,則將此欄數值要除以39.37(吋/公尺)
    例如,此欄數值若為 2834 (pixels per meter), 
    則 2834 ÷ 39.37 = 72 (pixels per inch) = 72 dpi
所以改成
語法:
            '**圖像改解析度**
            Dim byteData(&h2B) As Byte

            Open .FileName For Binary Access Read As #1
            Get #1, , byteData()
            Close #1
    
            '將影像解析度改成 150 dpi = 150*39.37 =取整數=> 5906 = 十六進制 17 12
            byteData(&H26) = &H12
            byteData(&H27) = &H17
            byteData(&H2A) = &H12
            byteData(&H2B) = &H17

            Open .FileName For Binary Access Write As #1
            Put #1, , byteData()
            Close #1
            '**************
300 dpi的話是 300*39.37=11811=2E 23

因為電腦讀檔案是以堆疊方式讀出
所以寫入時也就是用倒序方式寫入讀檔
所以要倒過來先填入 &H23 再填 &H2E
byteData(&H26) = &H23
byteData(&H27) = &H2E

此帖於 2009-08-02 04:54 PM 被 mini 編輯.
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
向 mini 送花的會員:
羅迪 (2009-09-19)
感謝您發表一篇好文章
舊 2009-08-03, 10:19 AM   #7 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

感謝版大,我發現我錯了,我發現它一載入圖片時解析度就變成72,而不是存檔後才改變的,這樣我是不是要在開啟圖檔那就要改了?謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-03, 11:03 AM   #8 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

引用:
作者: chung1206 查看文章
感謝版大,我發現我錯了,我發現它一載入圖片時解析度就變成72,而不是存檔後才改變的,這樣我是不是要在開啟圖檔那就要改了?謝謝。
都可以.....
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
舊 2009-08-03, 11:47 AM   #9 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

引用:
作者: mini 查看文章
都可以.....
SORRY版大,我還是一直有出現錯誤訊息,我可以傳我整個原始專案請您幫我看一下嗎?
謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-03, 12:50 PM   #10 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

那要處理的圖檔也不須附上...
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
舊 2009-08-03, 03:25 PM   #11 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

引用:
作者: chung1206 查看文章
SORRY版大,我還是一直有出現錯誤訊息,我可以傳我整個原始專案請您幫我看一下嗎?
謝謝。
看了一下 請問哪裡出錯 ...
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
舊 2009-08-03, 03:56 PM   #12 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

引用:
作者: mini 查看文章
看了一下 請問哪裡出錯 ...
這是還未加進版大的程式前的,所以沒有錯誤訊息,但加入您調整DPI的程式後就會出現,謝謝。

PS:按另存圖檔後會出現不正確的引用,在這行Open .FileName For Binary Access Read As #1
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-03, 09:36 PM   #13 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

加了個 ChangeFileDPI 副程式
及改良 Command2_Click()

不過你那個存檔方式還是只能存成 BMP格式 (只是改個副檔名成 .jpg實際上是掩耳盜鈴 ...)

語法:
Private Sub Command2_Click()
Dim i As Integer
    
    For i = Image1.LBound To Image1.UBound
        Image1(i).Picture = LoadPicture()
    Next
    Picture1.Refresh
    
End Sub

Private Sub Command3_Click()
Dim i As Integer, X As Long, Y As Long
    
    Picture1.AutoRedraw = True
    Picture1.Width = Image1(0).Width * 4
    Picture1.Height = Image1(0).Height * 2
    X = 0: Y = 0
    
    For i = 0 To 7
        If Image1(i).Picture <> 0 Then
            Picture1.PaintPicture Image1(i).Picture, X, Y, Image1(i).Width, Image1(i).Height
        End If
        X = X + Image1(0).Width
        If i = 3 Then
            X = 0
            Y = Y + Image1(0).Height
        End If
    Next
   
    With CommonDialog2
        .FileName = ""
        .Filter = "JPEG files (*.jpg) |*.jpg|BMP files (*.bmp) |*.bmp"
        .ShowSave
        If .FileName = "" Then Exit Sub
        
        SavePicture Picture1.Image, .FileName '存檔成 BMP
        ChangeFileDPI .FileName '改成適當DPI
    End With

End Sub

'改成適當DPI
Private Sub ChangeFileDPI(sFileName As String, Optional iDPI = 300#)  '預設 DPI為 300
Dim lFileID As Long
Dim byteData() As Byte
Dim sDPI As String, sMode As String
Dim bHiByte As Byte, bLoByte As Byte

    sMode = LCase(Right(sFileName, 3)) '得到最右邊的副檔名並統一轉成小寫
    If sMode = "bmp" Then iDPI = iDPI * 39.37 '如果是 BMP檔需換算
    
    sDPI = Right("0000" & Hex(iDPI), 4)     '將數字轉成四位形式的十六進位字串
    bHiByte = CByte("&H" & Left(sDPI, 2))   '取左邊兩個
    bLoByte = CByte("&H" & Right(sDPI, 2))  '取右邊兩個

    lFileID = FreeFile '向系統取得一個尚未被使用的檔案代碼
    
    '**改變 JPEG圖檔 解析度**
    If sMode = "jpg" Then
        ReDim byteData(17) As Byte
        
        '*取出適當的File Header資訊
        Open sFileName For Binary Access Read As #lFileID
        Get #lFileID, , byteData()
        Close #lFileID
        
        '換上所需的 DPI資訊
        byteData(14) = bHiByte
        byteData(15) = bLoByte
        byteData(16) = bHiByte
        byteData(17) = bLoByte

    '**改變 BMP圖檔 解析度**
    ElseIf sMode = "bmp" Then
        ReDim byteData(&H2B) As Byte
        
        Open sFileName For Binary Access Read As #lFileID
        Get #lFileID, , byteData()
        Close #lFileID
    
        byteData(&H26) = bLoByte
        byteData(&H27) = bHiByte
        byteData(&H2A) = bLoByte
        byteData(&H2B) = bHiByte

    Else
        Exit Sub
    End If
        
    '*存回
    Open sFileName For Binary Access Write As #lFileID
    Put #lFileID, , byteData()
    Close #lFileID
            
End Sub
其實 DPI應該根據 像素來算出適當的值
而不是固定用 300等固定值

此帖於 2009-08-04 08:20 AM 被 mini 編輯.
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
有 2 位會員向 mini 送花:
chung1206 (2009-08-04),羅迪 (2009-09-19)
感謝您發表一篇好文章
舊 2009-08-04, 08:59 AM   #14 (permalink)
註冊會員
 
chung1206 的頭像
榮譽勳章
UID - 322141
在線等級: 級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時級別:9 | 在線時長:134小時 | 升級還需:6小時
註冊日期: 2009-04-14
住址: Kaohsiung
文章: 192
精華: 0
現金: 121 金幣
資產: 521 金幣
預設

感謝版大小弟受益良多,因為之前有使用過Photoshop在Photoshop裡更改DPI的話像素也會跟著改變,但沒想到在程式裡卻不會,斗膽再請教如果更改像素的話會不會比較好?因為我用您的程式複製進去,DPI確實變成300了,但實際像素卻沒改變,謝謝。
chung1206 目前離線  
送花文章: 25, 收花文章: 108 篇, 收花: 261 次
回覆時引用此帖
舊 2009-08-04, 12:13 PM   #15 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時級別:96 | 在線時長:9729小時 | 升級還需:68小時
註冊日期: 2002-12-07
文章: 13276
精華: 0
現金: 26303 金幣
資產: 3024113 金幣
預設

引用:
作者: chung1206 查看文章
感謝版大小弟受益良多,因為之前有使用過Photoshop在Photoshop裡更改DPI的話像素也會跟著改變,但沒想到在程式裡卻不會,斗膽再請教如果更改像素的話會不會比較好?因為我用您的程式複製進去,DPI確實變成300了,但實際像素卻沒改變,謝謝。
DPI 只是告訴印表機排版系統
這張圖要印出的解析度
如果 DPI大於 像素值
那這個 DPI就沒意義
所以 DPI不能大於像素值

比如
某張圖其 寬=150像素
而 DPI裡的 水平解析度 卻是 300
那像 Photoshop這種智慧專業軟體
就會做出調整

你的程式應該根據要列印的長寬
而倒過來算出 最佳DPI才對
而不是活生生硬著頭皮規定 DPI
mini 目前離線  
送花文章: 2003, 收花文章: 7966 篇, 收花: 26761 次
回覆時引用此帖
發文 回覆


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
疑問 - VB6.0載入圖檔自動排列 chung1206 程式語言討論區 11 2009-07-31 08:50 PM
PhotoImpact 8可以做到圖片放大但是解析度不變嗎 80704 一般電腦疑難討論區 4 2003-08-09 10:18 AM
請問大大用什麼軟體可以讓圖片放大但是解析度不變?? 80704 一般電腦疑難討論區 5 2003-07-27 10:23 PM
請問製作網頁上的照片所限制的大小或解析度應為?? carrie_tsg 一般電腦疑難討論區 4 2003-04-28 05:05 PM
解析度調整到1024*768,但是字與圖片都太小 Taggen 硬體疑難使用問題討論區 4 2003-02-05 05:35 PM


所有時間均為台北時間。現在的時間是 06:00 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1