いつもお世話になっています。
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