Win32API質問箱 Build73at TECH
Win32API質問箱 Build73 - 暇つぶし2ch23:デフォルトの名無しさん
08/11/29 19:53:11
自分のこと俺って呼ぶ女の子ですね。分かります。そういうの嫌いじゃありません

24:デフォルトの名無しさん
08/11/29 20:55:39
※ わざと誤爆したり.NETマンセーして荒らす基地外が粘着中です ※

25:デフォルトの名無しさん
08/11/29 21:21:54
嫌いじゃないどころか燃えるのですが、私って変ですか?

26:デフォルトの名無しさん
08/11/29 22:16:44
AlphaBlend()がうまくいかないので教えてください。
BCBのソースで申し訳ないのですが基本的にはMFCなどと同等です。

Graphics::TBitmap* bt = new Graphics::TBitmap;
BLENDFUNCTION blend = {AC_SRC_OVER, 0, 100, 0};
RGBQUAD rgbq;
TCanvas* ti = Image1->Canvas;
bt->Width = 256;
bt->Height = 256;
bt->PixelFormat = pf32bit;

for (int i = 0; i < 255; i++) {
int* sc = reinterpret_cast<int*>(bt->ScanLine[i]);
for (int j = 0; j < 255; j++) {
rgbq.rgbBlue = i;
rgbq.rgbGreen = j;
sc[j] = reinterpret_cast<int&>(rgbq);
}
}

BOOL RESULT =
::AlphaBlend(ti->Handle, 0, 0, Image1->Width, Image1->Height,
bt->Handle, 0, 0, bt->Width, bt->Height,
blend);
if (RESULT == FALSE) {
Application->MessageBox(L"失敗!", L"", MB_OK);

これでImage1という場所に32bitのBitmapを透過度100で貼り付けようと
しているのですが、白い四角が表示されるだけです。しかもAlphaBlend()が
返す値は常にFALSE、つまり失敗しているのです。
BCB固有の部分を無視していただいて差し支えありません。単純に32bitの
Bitmapを透過度100程度で別の場所に貼り付けたいだけなのです。

27:デフォルトの名無しさん
08/11/29 22:24:35
GetLastError

28:デフォルトの名無しさん
08/11/29 22:27:52
87

29:デフォルトの名無しさん
08/11/29 22:31:36
>>27
わかりました。調べてみます。

30:デフォルトの名無しさん
08/11/29 22:46:04
>>27>>28
はい、その通りエラーコード87でした。
つまり ERROR_INVALID_PARAMETER って事ですか・・・

ちなみにAlphaBlend()を通さずに直接描画するとちゃんと
グラデーションがかかった256×256の画像が表示されるのですが、
どこがIvvalid Parameterなのやらさっぱり。

31:デフォルトの名無しさん
08/11/29 23:02:42
INVALID_PARAMETERって言われてるなら渡してるハンドルが変なんじゃないの
OWLだっけ?じゃなくて普通に作ったHDC渡して試すとか

32:デフォルトの名無しさん
08/11/29 23:06:03
VCLですが、HandleプロパティがVCL内部に保持している
オブジェクトのHDCを取り出します。
BCBのヘルプを見ても、Handleで取り出したHDCでWin32を
呼び出しているプログラム例が載っていました。

でも実際に呼び出しが失敗しているわけですから、もうHandleが
おかしいとしか考えられませんね。普通にHDC作ってやってみます。

33:デフォルトの名無しさん
08/11/29 23:08:46
URLリンク(www.geocities.jp)

例えばこれですが、Delphiなんですけどちゃんと動くんですよね。
ここを参考にBCBに移植したら動かなくなったので、移植が失敗
しているのかもしれません。

34:デフォルトの名無しさん
08/11/29 23:25:26
NescafeGoldBlend()

35:デフォルトの名無しさん
08/11/29 23:37:02
お騒がせしました。
×bt->Handle, 0, 0, bt->Width, bt->Height,
○bt->Canvas->Handle, 0, 0, bt->Width, bt->Height,

私のケアレスミスでした。無事動きました。

36:デフォルトの名無しさん
08/11/29 23:38:46
NescafeGoldBlendの大瓶500円で買ってきますた

37:デフォルトの名無しさん
08/11/29 23:57:47
職場で飲むのかえ?

38:デフォルトの名無しさん
08/11/30 01:47:06
そういやAlphaBlend() APIって計算式おかしいよね

Dst.Red = Src.Red * Src.Alpha + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Green * Src.Alpha + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Blue * Src.Alpha + (1 - Src.Alpha) * Dst.Blue

↑これが正しいはずなのに

> Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red
> Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green
> Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue

↑実際はこういう計算らしい

なんでこんなおかしな仕様なんだろう

39:デフォルトの名無しさん
08/11/30 02:13:36
うそん

40:デフォルトの名無しさん
08/11/30 02:15:24
>>38
SrcとAlphaの対応は固定だから事前に計算しておけば計算量が減るだろ?

41:デフォルトの名無しさん
08/11/30 02:22:38
>>38
もっとちゃんとヘルプ見た方がいいぞ。

42:デフォルトの名無しさん
08/11/30 03:16:14
>>40
違う

AC_SRC_ALPHAを指定するとSrc/Destは合成する画像のそれぞれのピクセルだから
ピクセルごとにRed/Green/Blue/Alphaの値は違う

43:デフォルトの名無しさん
08/11/30 06:28:55
>>38-42
要するに、Src(32bppDIB)をDstに合成したいときは、

AlphaBlend(Dst, Src)
ではなくて、

Tmp.Red = Src.Red * Src.Alpha
Tmp.Green = Src.Green * Src.Alpha
Tmp.Blue = Src.Blue * Src.Alpha
Tmp.Alpha = Src.Alpha
を用意しておいて、

AlphaBlend(Dst, Tmp)
って事でしょ。使えねぇw


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch