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