トップページ > 記事閲覧
ARGB8 形式の LoadSoftImage 関数
名前:あおむし 日時: 2017/11/18 12:35

いつもDXライブラリにお世話になっております。 今回は質問と言うより、こんな機能があったらいいなと言う要望です。 その要望と言うのが、 LoadSoftImage 関数で ARGB8 形式なのか XRGB8 形式なのかを決めさせて欲しいです。 現在開発中のモノの中で、 LoadSoftImage 関数を使って"非透過"PNG画像をプログラム側で透過処理を加え、 透過情報を持ったグラフィックハンドルを作ろうと思いました。 LoadSoftImage 関数で読み込んだソフトウェアイメージハンドルを GetPixelSoftImage 関数で1ピクセル毎のRGB情報を取得し、 そのRGBの各数値を参照にして格納する透明度の数値を計算し、 DrawPixelSoftImage 関数でそのピクセルに先ほどの透明度を格納する。 最後に、 CreateGraphFromSoftImage 関数で上記のソフトウェアイメージハンドルからグラフィックハンドルを作成する。 このようにして透過処理を加えようとしたのですが、結果は上手く行きませんでした。 そこで色々試行錯誤してる内に、リファレンスで BltSoftImageWithAlphaBlend 関数という物が目に留まりまして、 試しに別のソフトウェアイメージハンドルを MakeARGB8ColorSoftImage 関数で作成し、 最初に読み込んだ"非透過"画像のソフトウェアイメージハンドルを、用意した ARGB8 形式のイメージハンドルに BltSoftImageWithAlphaBlend 関数で転送しました。(これ以降の処理は失敗した最初の処理工程とおんなじ) これで実行したところ、結果は透過に成功しました。 恐らく、 LoadSoftImage 関数でのイメージハンドル作成時に、 読み込む画像が"透過"なら ARGB8 形式になり、"非透過"なら XRGB8 形式にすると言う処理になっていると思うのですが、 今回のように"非透過"画像に透過情報を持たせたい場合には、正直なところ不便だと感じました。 それにリファレンス側でも LoadSoftImage 関数についての説明の中でも、"透過"か"非透過"かよってイメージハンドルの形式が変更されると言う記述が無く、 今後の LoadSoftImage 関数に触ってゆくユーザーが、今回の私と同じ利用方法をされた時につまづいてしまうと思います。 お忙しい所申し訳ないですが、ご返答の方どうぞよろしくお願いしますm(_ _)m
メンテ

Page: 1 |

Re: ARGB8 形式の LoadSoftImage 関数 ( No.1 )
名前:管理人 日時:2017/11/19 13:46

LoadSoftImage で読み込まれる画像の形式は ARGB8 か XRGB8 かの二択ではなく、ARGB4 や R5G6B5 や A1R5G5B5 や ARGBF32 や ARGBF16 や、パレット256色画像( PAL8 )など様々なので、特定のフォーマットの画像として処理したい場合は あおむしさんがされたように LoadSoftImage で読み込んだソフトウェアイメージとは別に MakeARGB8ColorSoftImage などの 『自分の希望するフォーマット』のソフトウェアイメージを作成して、そこに処理後のイメージを書き込む、という形を想定しています int i, j, r, g, b, a, w, h, SrcHandle, DestHandle, GraphHandle ; SrcHandle = LoadSoftImage( "test1.bmp" ) ; GetSoftImageSize( SrcHandle, &w, &h ) ; DestHandle = MakeARGB8ColorSoftImage( w, h ) ; for( i = 0; i < h; i++ ) { for( j = 0; j < w; j++ ) { GetPixelSoftImage( SrcHandle, j, i, &r, &g, &b, &a ) ; // 加工後のピクセル値の書き込み DrawPixelSoftImage( DestHandle, j, i, r / 2, g / 2, b / 2, 128 ) ; } } GraphHandle = CreateGraphFromSoftImage( DestHandle ) ; DeleteSoftImage( SrcHandle ) ; DeleteSoftImage( DestHandle ) ; なので、そのことをまずリファレンスで説明していないのが問題なのですが、確かに ARGB8 や XRGB8 などの特定の フォーマットで読み込める関数があると便利だと思いましたので追加してみました よろしければこちらの関数を追加バージョンをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // Windows版 C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.exe // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.exe // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース こちらのバージョンでは以下の関数を追加しました int LoadARGB8ColorSoftImage( char *FileName ) ; int LoadXRGB8ColorSoftImage( char *FileName ) ; int LoadARGB8ColorSoftImageToMem( void *FileImage, int FileImageSize ) ; int LoadXRGB8ColorSoftImageToMem( void *FileImage, int FileImageSize ) ; それぞれ読み込んだ画像のフォーマットが ARGB8形式ではなかったら内部で ARGB8形式に変換する関数と XRGB8形式ではなかったら内部で XRGB8形式に変換する関数になります よろしければお使いください m(_ _)m
メンテ
Re: ARGB8 形式の LoadSoftImage 関数 ( No.2 )
名前:あおむし 日時:2017/11/19 17:58

LoadARGB8ColorSoftImage 関数を使ってみたところ、しっかり ARGB8 形式になっていました! お忙しい中わざわざ関数を追加していただき、ありがとうございます!!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存