
http://oshiete.goo.ne.jp/qa/8880161.html
このページなどで画像の取扱に関して詳しく教えていただきました。
大体、思ったことはできるようになったのですが
まだ疑問点が残っております。
例えば、24bit画像をGDI+で読み込んで、
アルファチャンネルに情報を書き加えた後、
そのまま画像を出力します。
するとirfanviewなどで読み込んだ際に
アルファチャンネルに情報をもっているにも拘わらず
24bit画像をとして認識されてしまいます。
アルファチャンネルをもっているかいないかではなく
画像のインデックスのところに24か32bitかを識別するものが含まれているようです。
読み込んだ24bit画像を32bit画像に変換したいのですが
どのようにすれば良いでしょうか?
GdipCreateBitmapFromScan0(lngWidth, lngHeight, 0, PixelFormat32bppARGB, ByVal 0&, hBmp2)
を使えば、32bit画像を生成できますが
新たにbitmapオブジェクトを生成せずに
読み込んだオブジェクトのbit数を変更する方法を教えてください。
No.1ベストアンサー
- 回答日時:
mitarashiです。
シリーズで回答させていただきながら、当方も勉強してきましたが、そろそろ追い越されそうな雰囲気ですね。お望みの事は分かりかねます。検索して見つかるのは、32bitカラーのGraphicsを質問文中にもあるGdipCreateBitmapFromScan0で作成した32bitのbitmapから作成する方法です。myumyu1234さんが行われているのは、個々のPixelの透明度の変更の様なので、GdipBitmapLockBitsをお使いなのでしょうか。
回答にはなっておりませんが、前回のhttp://oshiete.goo.ne.jp/qa/8880161.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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ビットマップの色数を変更するソフト知りませんか?
フリーソフト
-
JPEG24bitの画像に変換する方法
画像編集・動画編集・音楽編集
-
GDI+を使ったビット数とDPIの扱い
Visual Basic(VBA)
-
-
4
画像のビット数を調べるには?
デジタルカメラ
-
5
8bitインデックス画像の入出力方法
Visual Basic(VBA)
-
6
画像 ビットの深さ
Windows 7
-
7
ビットマップイメージの変更方法
Windows Vista・XP
-
8
C言語 配列の長さの上限
C言語・C++・C#
-
9
bmp形式の画像を色の深さを24ビットに変更する事は可能でしょうか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【EXCEL VBA】ダブルクリックで...
-
VB6での画像のサイズ変更に関して
-
EXCEL VBA 複数のImageコントロ...
-
画像認識アルゴリズムについて
-
HP上で画像をUPできるよう...
-
背景画像の繰り返しについて
-
UWSCの画像認識と条件分岐につ...
-
画像のビット数を変更する方法
-
VBAのユーザーフォームのイメー...
-
画像のピクセルデータの取得
-
OpenCVで出力を24bitのbmpにす...
-
画像の存在チェック
-
エクセルのマクロでコンタクト...
-
ラジオボタンを押すと、ランダ...
-
画像の抽出
-
「ご処理進めて頂きますようお...
-
UPS警告音を止めたい
-
CloseとDisposeの違い
-
エクセルで、日付を入力すると...
-
エクセルVBAで、MsgBox やInput...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCEL VBA 複数のImageコントロ...
-
VBAのユーザーフォームのイメー...
-
Excel ユーザーフォームで表示...
-
【EXCEL VBA】ダブルクリックで...
-
スマホでサイトの画像を長押し→...
-
UWSC 画像判定と条件分岐について
-
HTMLで画像をポップアップで表...
-
「using Windows」でエラーが出る
-
画像のビット数を変更する方法
-
画像処理したBitmapをピクチャ...
-
UWSC「画像が無い場合」
-
背景画像の繰り返しについて
-
PowerPoint VBA で画像の鮮明度...
-
uwcs のマクロで画像認識をして...
-
gif 画像上の ボタンに リン...
-
画像が分割されて切り替わる、...
-
uwscの画像認識に失敗します。
-
C#で画像を他の画像に貼り付け...
-
vb.net 画像の透過について
-
MFCでCImageListに画像追加失敗
おすすめ情報