• 締切済み

画像のビット数を変更する方法

http://okwave.jp/qa/q8880161.html このページなどで画像の取扱に関して詳しく教えていただきました。 大体、思ったことはできるようになったのですが まだ疑問点が残っております。 例えば、24bit画像をGDI+で読み込んで、 アルファチャンネルに情報を書き加えた後、 そのまま画像を出力します。 するとirfanviewなどで読み込んだ際に アルファチャンネルに情報をもっているにも拘わらず 24bit画像をとして認識されてしまいます。 アルファチャンネルをもっているかいないかではなく 画像のインデックスのところに24か32bitかを識別するものが含まれているようです。 読み込んだ24bit画像を32bit画像に変換したいのですが どのようにすれば良いでしょうか? GdipCreateBitmapFromScan0(lngWidth, lngHeight, 0, PixelFormat32bppARGB, ByVal 0&, hBmp2) を使えば、32bit画像を生成できますが 新たにbitmapオブジェクトを生成せずに 読み込んだオブジェクトのbit数を変更する方法を教えてください。

みんなの回答

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

mitarashiです。シリーズで回答させていただきながら、当方も勉強してきましたが、そろそろ追い越されそうな雰囲気ですね。お望みの事は分かりかねます。検索して見つかるのは、32bitカラーのGraphicsを質問文中にもあるGdipCreateBitmapFromScan0で作成した32bitのbitmapから作成する方法です。 myumyu1234さんが行われているのは、個々のPixelの透明度の変更の様なので、GdipBitmapLockBitsをお使いなのでしょうか。 回答にはなっておりませんが、前回のhttp://okwave.jp/qa/q8880161.htmlへの回答のコードがどうも分かり難いと思っていましたが、どうやら冗長らしいので、その部分を修正し、24->32bitへの変更も盛り込んだコードを投稿させていただきます。 なお、32bitをサポートしているPNGでの保存に変更しています。 構造体、API宣言は、下記が追加になります。 Public Const CLSID_PNG As String = "{557CF406-1A04-11D3-9A73-0000F81EF32E}" Public Declare Function GdipGraphicsClear Lib "gdiplus" (ByVal graphics As Long, ByVal lColor As Long) As Long Sub test() Dim IID_IDispatch As GUID Dim udtInput As GdiplusStartupInput Dim lngToken As Long, lngStatus As Long Dim pGraphics As Long Dim pSrcBmp As Long, pDstBmp As Long Dim lngWidth As Long, lngHeight As Long Dim srcPath As String, dstPath As String Const myDpi As Long = 300 srcPath = GetDesktopPath & "\sample1.jpg" dstPath = GetDesktopPath & "\sample2.png" ' 初期化 udtInput.GdiplusVersion = 1 If GdiplusStartup(lngToken, udtInput, ByVal 0&) <> 0 Then Exit Sub End If ' 画像の読みこみ If GdipCreateBitmapFromFile(ByVal StrPtr(srcPath), pSrcBmp) <> 0 Then GdiplusShutdown lngToken Exit Sub End If ' 元画像サイズの取得 GdipGetImageWidth pSrcBmp, lngWidth GdipGetImageHeight pSrcBmp, lngHeight ' コピー先Bitmap作成 lngStatus = GdipCreateBitmapFromScan0(lngWidth, lngHeight, 0, PixelFormat32bppARGB, ByVal 0&, pDstBmp) 'dpiの指定 lngStatus = GdipBitmapSetResolution(pDstBmp, myDpi, myDpi) If lngStatus = 0 Then ' コピー用Graphics作成 If GdipGetImageGraphicsContext(pDstBmp, pGraphics) = 0 Then '白で初期化(検索してみつかったコードは大抵含んでいたので追加) GdipGraphicsClear pGraphics, &HFFFFFFFF ' イメージのコピー GdipDrawImageRectI pGraphics, pSrcBmp, 0, 0, lngWidth, lngHeight 'Graphicsの始末 GdipDeleteGraphics pGraphics 'PNGで保存 Call GdipSaveImageToFile(pDstBmp, StrPtr(dstPath), ConvCLSID(CLSID_PNG), ByVal 0&) End If GdipDisposeImage pDstBmp End If GdipDisposeImage pSrcBmp GdiplusShutdown lngToken End Sub

関連するQ&A