トップページ > 記事閲覧
半透明PNGをMakeScreen画像に描画し、それを画面に描画すると元より暗く表示される
名前:SmokingWOLF 日時: 2025/03/28 12:44

いつもDXライブラリに大変お世話になっております。 MakeScreenで作った描画可能画像に半透明部分を含むPNG画像を書き込んだ後、 そのMakeScreen画像を表画面に描画すると、半透明部分の色が 期待より暗く表示されてしまう現象が発生しましたのでご報告いたします。 【再現ソースコード】 #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); // ウィンドウモードに if (DxLib_Init() == -1) { return -1; } // DXライブラリ初期化処理 int pngHandle = LoadGraph("Test_TransPNG.png"); // 半透明部分を含むPNG画像を読み込む // ●普通に描画対象を表画面にしてPNG画像を描画する場合(正常なケース) SetDrawScreen(DX_SCREEN_FRONT); DrawGraph(0, 50, pngHandle, TRUE); // PNG画像をそのまま書き込み DrawString(10, 10, "PNG画像をそのまま表画面に描画した場合\n(右側の半透明部分が期待通りに描画されている)", GetColor(155, 155, 255)); WaitKey();// キー入力待ち ClsDrawScreen();//画面を消去 // ●次にMakeScreenに同じ画像を書き込んだものを表画面に描画する場合(期待通りでないケース) int handle = MakeScreen(640, 480, TRUE); // 640x480サイズのアルファチャンネルありの描画可能画像を作成 SetDrawScreen(handle); // 作成したMakeScreen画像を描画対象にする DrawGraph(0, 0, pngHandle, TRUE); // 画像の透明度を有効にしてMakeScreenにPNG画像を書き込み SetDrawScreen(DX_SCREEN_FRONT); // 描画対象を表画面にする DrawGraph(0, 50, handle, TRUE); // MakeScreenの内容を表画面に書き込み DrawString(10, 10, "PNG画像を書き込んだMakeScreen内容を表画面に描画した場合\n(右側の半透明部分の色が変わる)", GetColor(155, 155, 255)); WaitKey();// キー入力待ち DeleteGraph(handle);// MakeScreen で作成したグラフィックハンドルの削除 DeleteGraph(pngHandle);// PNG画像のグラフィックハンドルの削除 DxLib_End(); // DXライブラリの後始末 return 0; // ソフトの終了 } 【テストに使用した画像】 silversecond.net/tmp/Test_TransPNG.png 【実行したときのスクリーンショット】 ・1枚目(PNGを直接画面描画して期待通りに表示されるケース) silversecond.net/tmp/20250328_DxLibTest1.png ・2枚目(PNGをMakeScreenに書き込んだものを表示して半透明部分が期待通り表示されないケース) silversecond.net/tmp/20250328_DxLibTest2.png 【状況】 上記ソースコードを実行すると、 最初の「PNG画像をそのまま表画面に描画した場合」では期待通りの表示になりますが、 次の「PNG画像をMakeScreen画像に書き込み、そのMakeScreen画像を表画面に描画」すると、 半透明部分が期待と違って元より暗く表示されます。 (なお半透明でない部分に関しては、どちらも期待通り表示されているように見えます) 使用したDXライブラリはVer3.25(3/28の12:00にダウンロードさせていただいたDxLibVCTest.zip)、 コンパイル環境はVisual Studio Community 2022の「x86」です。 お手数をおかけしますが、よければ一度ご確認いただけますと幸いです。
メンテ

Page: 1 |

Re: 半透明PNGをMakeScreen画像に描画し、それを画面に描画すると元より暗く表示される ( No.1 )
名前:管理人 日時:2025/03/29 01:57

アルファチャンネルを含む画像に対して半透明の描画を行った後、その画像を更に描画した際に 正常な描画結果を得るためには『乗算済みアルファ』というものを使用する必要があります DXライブラリにも『乗算済みアルファ』の機能があり、こちらのページで解説していますので よろしければご覧ください m(_ _)m <乗算済みアルファのすすめ> https://dxlib.xsrv.jp/lecture/PremulAlpha/PremulAlpha.html
メンテ
Re: 半透明PNGをMakeScreen画像に描画し、それを画面に描画すると元より暗く表示される ( No.2 )
名前:SmokingWOLF(解決済み) 日時:2025/03/29 11:01

ご教示ありがとうございます! バグではなかったとのことで、こちらの調査不足でお手数をおかけして誠に申し訳ございません。 ソースコードを以下のように修正することで無事問題が解消されました。 親切に教えてくださってありがとうございます! #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); // ウィンドウモードに if (DxLib_Init() == -1) { return -1; } // DXライブラリ初期化処理 // 画像を読み込んだ後、乗算済みアルファ画像に変換する設定を有効にする SetUsePremulAlphaConvertLoad(TRUE); // ←★追加行 // 乗算済みアルファ画像用のαブレンドの設定にする SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255); // ←★追加行 int pngHandle = LoadGraph("Test_TransPNG.png"); // 半透明部分を含むPNG画像を読み込む 〜以下同文
メンテ

Page: 1 |

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

   クッキー保存