• ベストアンサー

bmp画像をjpegやpng画像に圧縮する方法

http://okwave.jp/qa/q8809275.html このページでbmp画像をtiff圧縮する方法を教えていただきました。 このプログラムを改良して jpegやpng画像にも対応したプログラムを作ることはできないでしょうか? 恐らく、    CLSIDFromString StrPtr("{E09D739D-CCD4-44EE-8EBA-3FBF8BE4FC58}"), .Guid ' 圧縮方法 というところを書き換えれば、他の形式にも対応できると思うのですが、 CLSIDFromString で検索しても、情報は見つかりませんでした。 どうか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1,2です。KenKen_SP様には失礼して、改造部分のコードを提示させていただきます。Win7Home(64) xl2010(32) で試しています。 出典:http://okwave.jp/qa/q5124395.html ' // Bitmapオブジェクトからファイルへ書き出し Public Function SaveImageToFile( _ ByVal hBmp As OLE_HANDLE, _ ByVal sFilename As String, _ Optional ByVal sFormat As String = "JPG", _ Optional ByVal nQuarity As Long = 60 _ ) As Boolean '@ sFormat : BMP, JPG, GIF, TIF, PNG '@ nQuality: 0-100(0:高圧縮低画質, 100:低圧縮高画質, Jpg のみ有効) Dim sEncoderStr As String Dim nStatus As Long Select Case UCase$(sFormat) Case "JPG": sEncoderStr = ENCODER_JPG Case "GIF": sEncoderStr = ENCODER_GIF Case "TIF": sEncoderStr = ENCODER_TIF Case "PNG": sEncoderStr = ENCODER_PNG Case Else: sEncoderStr = ENCODER_BMP End Select Dim uEncoderParams As EncoderParameters ' Jpeg のクオリティー設定 If UCase$(sFormat) = "JPG" Then nQuarity = Abs(nQuarity) If nQuarity > 100 Then nQuarity = 100 uEncoderParams.count = 1 With uEncoderParams.Parameter(0) .GUID = pvToCLSID(QUALITY_PARAMS) .TypeAPI = 4 ' Type Long .Value = VarPtr(nQuarity) .NumberOfValues = 1 End With End If ' 保存処理 If UCase$(sFormat) = "JPG" Then nStatus = GdipSaveImageToFile(hBmp, _ StrPtr(sFilename), _ pvToCLSID(sEncoderStr), _ VarPtr(uEncoderParams)) Else nStatus = GdipSaveImageToFile(hBmp, _ StrPtr(sFilename), _ pvToCLSID(sEncoderStr), _ ByVal 0&) End If SaveImageToFile = CBool(nStatus = 0) Call GdipDisposeImage(hBmp) End Function ' // サンプル Sub Sample() Dim hBmp As OLE_HANDLE Dim file1 As String file1 = GetDesktopPath & "\Hydrangeas.bmp" ' GDI+ を初期化する If GDIplus_Initialize() = False Then MsgBox "GDI+ を初期化できません", vbCritical Exit Sub End If '変換元ファイル読込 If GdipCreateBitmapFromFile(ByVal StrPtr(file1), hBmp) <> 0 Then Gdiplus_Shutdown Exit Sub End If ' 保存(JPEG でクオリティー30の場合) If SaveImageToFile(hBmp, GetDesktopPath & "\sample.jpg", "jpg", 30) = False Then MsgBox "保存に失敗", vbCritical Else MsgBox "保存に成功", vbInformation End If ' GDI+ を終了させる(必ず呼び出すこと) Call Gdiplus_Shutdown End Sub 'テスト用 Private Function GetDesktopPath() As String Dim wScriptHost As Object, strInitDir As String Set wScriptHost = CreateObject("Wscript.Shell") GetDesktopPath = wScriptHost.SpecialFolders("Desktop") Set wScriptHost = Nothing End Function

KUZUY
質問者

お礼

うまくいきました。 ありがとうございます。  

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。確認不足で申し訳ありません。 Function SaveImageToFileの中の、 下記が余分です。 nStatus = GdipCreateBitmapFromHBITMAP(hBmp, 0&, pNewImage) これはHBITMAPオブジェクトから、ビットマップオブジェクトに変換する処理になります。 クリップボードから、CF_BITMAP指定で取得したデータは(GDIの描画結果を保持しておくために用いられる)デバイス依存ビットマップオブジェクトHBITMAPというものだそうで、上記の処理が必要になりますが、 GdipCreateBitmapFromFileが与えるのはデバイス非依存のビットマップオブジェクトなので、この変換処理が不要です。(行うと不具合が出ます) という訳で、GdipCreateBitmapFromFileで取得したビットマップオブジェクトのハンドルを、GdipCreateBitmapFromHBITMAPを介さずに以降の処理に渡して下さい。 元の記事のかなりの改造になりますので、投稿は控えておきますが、KUZUYさんは、ご自分でこの程度の改造はできるスキルをお持ちとお見受けします。もし、うまくいかない場合は補足して下さい。

KUZUY
質問者

お礼

ありがとうございます。 nStatus = GdipCreateBitmapFromHBITMAP(hBmp, 0&, pNewImage) を削除するだけではうまくいかないのですが。 その後の SaveImageToFile = CBool(nStatus = 0) などの改造する必要があると思いますがどのようにすれば良いでしょうか? いろいろと試してみましたがわかりませんでした。 お時間あるときで構いませんので具体的に教えていただけないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

前のご質問であげられていたURLを辿っていくと存在するのですが、 http://okwave.jp/qa/q5124395.html の#5のKenKen_SPさんの回答がご参考になるでしょう。 こちらでは、クリップボードから、 ' Bitmap のハンドル(メモリ上のアドレスみたいなもの)を取得 hBmp = pvGetHBitmapFromClipboard() としていますが、先のご質問で紹介したページにあるコードの、 '-- 元ファイル読込   Dim image As Long   If GdipCreateBitmapFromFile(ByVal StrPtr(file1), image) <> 0 Then Goto Finally imageという変数が、上記のhBmpに相当します。 これらを組み合わせればお望みの事が出来ると思います。 明日は早いので試している時間が取れません。あしからず。

KUZUY
質問者

お礼

ありがとうございます。 #5のプログラムをそのままコピーした後に 下記のようにやってみましたが、 「保存に失敗」となってしまいます。 どこを改良すれば良いでしょうか? 急いでいるわけではありませんので、 週明けで構いませんのでご指示いただけないでしょうか? よろしくお願いいたします。 option explicitに Declare Function GdipCreateBitmapFromFile Lib "gdiplus" (filename As Any, bitmap As Long) As Long を追加した上で、以下をsubにコピー。 Sub Sample() Dim hBmp As OLE_HANDLE Const file1 = "D:\Documents and Settings\desktop\新しいフォルダー\00000.bmp" Const file2 = "D:\Documents and Settings\desktop\新しいフォルダー\00000.tif" Const file3 = "D:\Documents and Settings\desktop\新しいフォルダー\00000.jpg" ' GDI+ を初期化する If GDIplus_Initialize() = False Then MsgBox "GDI+ を初期化できません", vbCritical Exit Sub End If '-- 元ファイル読込 'Dim hBmp As Long If GdipCreateBitmapFromFile(ByVal StrPtr(file1), hBmp) <> 0 Then GoTo Finally ' 保存(JPEG でクオリティー30の場合) If SaveImageToFile(hBmp, file3, "jpg", 30) = False Then MsgBox "保存に失敗", vbCritical Else MsgBox "保存に成功", vbInformation End If Finally: ' GDI+ を終了させる(必ず呼び出すこと) Call Gdiplus_Shutdown End Sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • jpeg非可逆圧縮、gif, png 可逆圧縮

    jpegが非可逆圧縮、gif, png が可逆圧縮という場合、何を意味しているのでしょうか。 圧縮しない、bmpなどのファイルを、画像ソフトで開いて、jpeg やpng などの形式で保存したとします。 圧縮され、容量は小さくなります。 そのファイルを、また画像ソフトで開きます。 可逆圧縮のpngは、bmpであったときと同質の表現がされるのでしょうか。 非可逆圧縮のjpgは、少し落ちた画質で、再現されるのでしょうか。 可逆、非可逆とは、そういったことを言っているのでしょうか、それともまた別のことを指しているのでしょうか。

  • bmp画像をtiff圧縮する方法

    VBAを使って、bmp画像をtiff圧縮するプログラムを教えてください。 検索すると http://okwave.jp/qa/q8508126.html 画像圧縮、変換用のライブラリ を使えば良いという回答ページは見つかったのですが 具体的な方法が分かりません。 「画像 dll vba tif bmp」などで検索してみても分かりませんでしたので 教えてください。

  • 画像、保存規格「PNG」と「BMP」について質問します。

    画像、保存規格「PNG」と「BMP」について質問します。 以前、ソフトウエアのカテゴリーで、「PNG」の保存法について 質問をした者ですが(下記URL)、補足質問を。 http://questionbox.jp.msn.com/qa6160261.html 「PNG」の、可逆圧縮式についてですが、画像ソフトで、 開いて、加工、上書き、「PNG」での保存を繰り返しても、 最初の画像の品質は、維持されるのでしょうか?。 (もちろん、ソフトにもよると思いますが) 又、VISTAでは、「BMP]よりも「TIFF(TIF)」をロスの無い 画像保存に推薦しており、WIN7に到っては、隅に追いやられて しまった様な感じを受けました。「BMP」に将来は、 あるのでしょうか?。 「BMP」に、こだわっておられる方御意見を。 簡潔な、御回答お待ちしています。

  • VBAで画像圧縮はできますか?

    VBAを使って、 bmp画像ファイルをJPEGやTIFFファイルに圧縮したいのですが 可能でしょうか? よろしくお願い致します。

  • [JPEG vs PNG]

    [JPEG vs PNG] 某商業高校の学生です。 先日、ファイルの種類について習いました。 先生曰く、「JPEGは圧縮率が高くその代償に、圧縮すると画質が落ちる。おまけに背景を透明に出来ない(透明では無く白になる)。」そして、「PNGはJPEGと比べて(同じ画像の場合)サイズは大きいが圧縮による劣化が無く、色もたくさん使えるのでより高画質である」と言ってました。 僕は、ほぼ全ての画像をJPEGで保存しています。画像は、壁紙として使ってます。PNGの方が高画質ならJPEGからPNGに変換すべきでしょうか? また、リサイズにゆる劣化もPNGなら防げますか?

  • JPEGとBMP

    JPEGで保存してある画像をBMP形式に変換する事というのは可能なのでしょうか? また、JPEG形式の画像を2値化するプログラムをC言語で書くことは可能なのでしょうか? JPEGとBMPの違いがよく分からないので、そのあたりも教えていただけるとありがたいです。 よろしくお願いします。

  • イーファンで圧縮したらBMP画像になった

    ヤフー出品で圧縮したらjpegがBMP画像になってしまいました。 別のソフトで圧縮はそのままでjpegにして出品画像を作りましたのでヤフーに関しては問題ないのですが。 イーファンではjpegのまま圧縮するように設定はできるのですか。 私はキャノンについていたzoom browserEXとイーファンだけですが、これで画像の簡単な編集は十分ですよね。 winxp イーファン初心者 画像はほとんど編集しない 

  • 無圧縮の画像ファイルの違い

    無圧縮の画像ファイルと言われている、tiff、btm、pngファイルについてですが、 どれも、32bitまで対応しているのに、tiffは写真などに変換するときによく使われ pngはネットの画像によく使われると聞きます。 その違いというのはなんでしょうか? 色空間の違いでしょうか tiffはadobeRGBに対応するけれども、pnbは対応していないとか? よろしくお願いします。

  • 画像のファイル形式の違いについて

     画像のファイル形式って、たくさんあって、違いがよくわかりません。JPEG,TIFF,BMP,PICT,GIF,PNGって具合にほんとたくさんあって、困ってます。  それぞれがどのように違うのを教えてください。たぶん、圧縮の仕方が違うだと思うのですが。本とか、ホームページとかも教えてくれたら嬉しいです。

  • .pngの画像ファイルについての質問

    自分は今まで、画像ファイルを(画質は落ちるが)容量を小さく保存するのは.jpeg方式だと思ってました。それ以外は、bmpとgifしか知りませんでした。最近.pngの拡張子の画像を見かけるようになったのですが、これは新しい画像の保存形式でしょうか?.pngは.jpegよりも高画質の小容量で保存できますか?だとすると、どうやって.jpegや.bmpを.pngに変えられるのでしょうか?(ソフト使用ですか?)