- 1 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 03:39:51 ]
- このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 C++Builder使いが優しくコメントを返しますが、 お礼はC++Builderの布教と初心者の救済をお願いします。 Borland Home Page www.borland.co.jp/ <過去スレ> くだすれC++Builder(超初心者用) pc8.2ch.net/test/read.cgi/tech/1117225464/l50 くだすれC++Builder(超初心者用)その2 pc10.2ch.net/test/read.cgi/tech/1144308804/l50 <兄弟スレ> くだすれDelphi(超初心者用)その39 pc10.2ch.net/test/read.cgi/tech/1169386914/l50
- 855 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:35:28 ]
- >>843
Win32スレで聞いているうちにバグの原因がわかったので、 AlphaBlend per Pixelのプログラムを貼っておきます。 void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap* bt = new Graphics::TBitmap; BLENDFUNCTION blend = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; TImage* ti = Image1; RGBQUAD rgbq; bt->Width = 256; bt->Height = 256; bt->PixelFormat = pf32bit; int k = 0; for (int i = 0; i < 255; i++, k++) { int* sc = reinterpret_cast<int*>(bt->ScanLine[i]); for (int j = 0; j < 255; j++) { rgbq.rgbBlue = i; rgbq.rgbGreen = j; rgbq.rgbRed = 0; rgbq.rgbReserved = k; sc[j] = reinterpret_cast<int&>(rgbq); } } BOOL RESULT = ::AlphaBlend(ti->Canvas->Handle, 0, 0, ti->Width, ti->Height, bt->Canvas->Handle, 0, 0, bt->Width, bt->Height, blend); int err = GetLastError(); const wchar_t* str = WideString().sprintf(L"失敗!%d", err).c_bstr();
- 856 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:36:10 ]
- if (RESULT == FALSE) {
Application->NormalizeTopMosts(); Application->MessageBox(str, L"AlphaBlend()でエラーが起きました", MB_OK); Application->RestoreTopMosts(); } delete bt; }
- 857 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 00:42:59 ]
- 補足ですが、rgbq.rgbReserved must be zero.とMSDNには書いて
ありますが、これがまさにアルファ値そのものです。 ですからここにアルファ値をセットしてAlphaBlend()を呼び出せば、 期待通りの結果が得られます。 もちろんPixelFormatはpf32bitでなければなりません。
|

|