トップページ > 記事閲覧
乗算済みα使用時SetUseTransColorが無効
名前:8127 日時: 2018/08/27 22:13

いつもお世話になっています。 24ビットのアルファ値情報なしのpngファイルを読み込む際にSetUseTransColor(FALSE);すると 色が黒い部分が透過色に化けてしまうことが防げます。 この機能を使いたいのですが、乗算済みα機能と相性が悪く、下のサンプルでusePreMulAlphaを変えると実行結果が変わってしまいます。 (usePreMulAlpha=trueだとSetUseTransColor(FALSE)が働いていない) どうにか回避する方法が分かる方はご教授ください。 (個人的にも24bit pngは使いたくないのですが、SaveDrawScreenToPNGでスクリーンショットを保存した時のフォーマットが24bitなので困っています) #include "DxLib.h" namespace { constexpr int windowWidth = 640; constexpr int windowHeight = 480; } bool dxlibInit() { ChangeWindowMode(TRUE); //ウインドウモードにする SetWindowSize(windowWidth, windowHeight); // DXライブラリ初期化処理 if (DxLib_Init() == -1) { return false; } SetDrawScreen(DX_SCREEN_BACK); //描画先を裏画面に設定 return true; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //ここを変更する constexpr bool usePreMulAlpha = !true; // SetUseTransColor(FALSE); if (!dxlibInit()) { // エラーが起きたら直ちに終了 return 1; } if (usePreMulAlpha) { // 画像を読み込んだ後、乗算済みアルファ画像に変換する設定を有効にする SetUsePremulAlphaConvertLoad(TRUE); } int handle = LoadGraph("test.png"); if (usePreMulAlpha) { SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255); } else { SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255); } //見えてはいけないはずの背景ピンク色 DrawBox(0, 0, windowWidth, windowHeight, GetColor(255, 128, 128), TRUE); DrawGraph(0, 0, handle, TRUE); // ScreenFlip(); WaitKey(); DeleteGraph(handle); handle = -1; DxLib_End(); return 0; } 再現した24bit pngを置いておきます。(Imgur側で再エンコードされて24bitでなくなっていないことを祈ってます) h t t p s://i.imgur.com/4byk5PB.png
メンテ

Page: 1 |

Re: 乗算済みα使用時SetUseTransColorが無効 ( No.1 )
名前:管理人 日時:2018/08/29 01:15

ご指摘&再現用のプログラムありがとうございます すみません、SetUsePremulAlphaConvertLoad(TRUE); を実行している場合でも SetUseTransColor(FALSE); の設定が反映されるように 修正したバージョンをアップしましたので、よろしければお使いください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) > (個人的にも24bit pngは使いたくないのですが、SaveDrawScreenToPNGでスクリーンショットを保存した時のフォーマットが24bitなので困っています) MakeScreen の第三引数を TRUE にしてアルファチャンネル付きの画像を作成して、そのグラフィックハンドルを SetDrawScreen で描画対象にした状態で SaveDrawScreen を実行すると 32bit で保存されます
メンテ
Re: 乗算済みα使用時SetUseTransColorが無効 ( No.2 )
名前:8127 日時:2018/08/29 23:40

管理人さま、 ご対応どうもありがとうございます。正常に動作することを確認しました。 >MakeScreen の第三引数を TRUE にしてアルファチャンネル付きの画像を作成して、そのグラフィックハンドルを >SetDrawScreen で描画対象にした状態で SaveDrawScreen を実行すると 32bit で保存されます そうなのですね。確かにMakeScreenでアルファチャンネルなしの画像にしていたので24bitになったみたいです。 ・・・ところで、乗算済みαについてミニテクを読んでも分からない点があるので質問させてください。 1、DX_BLENDMODE_PMA_ALPHAのような乗算済みα専用のブレンドモードがあるのは何故ですか? というのも、普通なら「常にDX_BLENDMODE_ALPHAなどを指定し、乗算済みαで作成されたグラフィックハンドルで描画する際は、 自動でDX_BLENDMODE_PMA_ALPHAの挙動をする」といった方法を取ると思うのです。 2、乗算済みαは、わざわざSetUsePremulAlphaConvertLoad(TRUE);をしないと使えませんが、 デフォルトでオフになっているということは何か乗算済みαのデメリットがあるのでしょうか? よろしくお願いいたします。
メンテ
Re: 乗算済みα使用時SetUseTransColorが無効 ( No.3 )
名前:管理人 日時:2018/08/30 01:00

> 1、DX_BLENDMODE_PMA_ALPHAのような乗算済みα専用のブレンドモードがあるのは何故ですか? グラフィックハンドルには乗算済みαの画像かどうかの情報は保存されていないからです また、画像ファイルの時点で乗算済みαの画像に変換されていた場合 SetUsePremulAlphaConvertLoad(TRUE); を 設定した上で読み込まなくてもその画像は乗算済みαの画像となるので、そのような画像も含めて乗算済みαの 画像かどうかをグラフィックハンドルに保持する場合は『読み込み時に乗算済みαの画像に変換しないけど、 乗算済みαの画像として扱う』設定をするための関数を用意したりしなければならなかったりと煩雑に なってしまうというのもあります > 2、乗算済みαは、わざわざSetUsePremulAlphaConvertLoad(TRUE);をしないと使えませんが、 > デフォルトでオフになっているということは何か乗算済みαのデメリットがあるのでしょうか? 乗算済みαの画像はαブレンドや加算ブレンドには適していますが、DX_BLENDMODE_MUL の乗算ブレンドや DX_BLENDMODE_HALF_ADD の半加算ブレンドなどには対応していません あと、GraphFilter のフィルターでも全てのフィルターが乗算済みαに対応しているわけではなかったりと、 乗算済みαの画像は通常の画像の完全な上位互換というわけではないので、デフォルトではオフとなっています
メンテ
Re: 乗算済みα使用時SetUseTransColorが無効 ( No.4 )
名前:8127(解決) 日時:2018/08/31 15:39

管理人様、 ご回答ありがとうございます! そうですか、グラフィックハンドルに乗算済みαの画像かどうかは保存されていないのですか、少し意外です。 > 乗算済みαの画像はαブレンドや加算ブレンドには適していますが、DX_BLENDMODE_MUL の乗算ブレンドや > DX_BLENDMODE_HALF_ADD の半加算ブレンドなどには対応していません たしかにそうですね。乗算ブレンドが必要な場合は自前で乗算済みのあるなしのハンドルを用意することにします。
メンテ

Page: 1 |

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

   クッキー保存