お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"透過率を指定してビットマップをコピーする"

この発言に対し以下のコメントが寄せられています
#00800 とよぞう さん RE:256色マスク指定、ビットマップをコピー

Title: 透過率を指定してビットマップをコピーする  ‘透過率’を指定してビットマップをコピーするサンプルコードです。  透過処理の都合で、コピー元およびコピー先のビットマップをフルカラー に変換します。 procedure CopyBitmapWithTransparency( bmpDst: TBitmap; // コピー先ビットマップ pointDst: TPoint; // コピーする場所の左上の座標 bmpSrc: TBitmap; // コピー元ビットマップ clTransparency: TColor; // RGB毎の透過率 clBkg: TColor // 背景色 ); 【注!】 TColor は RGB値そのものとして扱います。clRed などを使うときは clBkg := ColorToRGB(clRed); としてください。 以下、ソースコードと使用例です。 procedure CopyBitmapWithTransparency(bmpDst: TBitmap; pointDst: TPoint; bmpSrc: TBitmap; clTransparency, clBkg: TColor); var rectDst, rectSrc, rectTmp: TRect; RTrns, GTrns, BTrns: BYTE; x, y: Integer; prgbDst, prgbSrc: PRGBQuad; rgbBkg: TRGBQuad; begin // 重なっている(コピーする)部分を計算する rectSrc := RECT(0, 0, bmpSrc.Width, bmpSrc.Height); OffsetRect(rectSrc, pointDst.x, pointDst.y); rectDst := RECT(0, 0, bmpDst.Width, bmpDst.Height); IntersectRect(rectTmp, rectDst, rectSrc); // 重なっている部分がある場合には、コピー処理する if(rectTmp.Left < rectTmp.Right)and (rectTmp.Top < rectTmp.Bottom)then begin // ピクセルあたりのデータサイズを DWORD に揃える bmpDst.PixelFormat := pf32Bit; bmpSrc.PixelFormat := pf32Bit; // 重なった領域のデータからコピー元とコピー先の領域を設定する rectDst := rectTmp; OffsetRect(rectTmp, -pointDst.x, -pointDst.y); rectSrc := rectTmp; // 透過率を RGB毎に取得する RTrns := GetRValue(clTransparency); GTrns := GetGValue(clTransparency); BTrns := GetBValue(clTransparency); // 背景色をビットマップ内部データの型に変換する rgbBkg.rgbRed := GetRValue(clBkg); rgbBkg.rgbGreen := GetGValue(clBkg); rgbBkg.rgbBlue := GetBValue(clBkg); rgbBkg.rgbReserved := 0; for y := rectSrc.Top to rectSrc.Bottom - 1 do begin // コピー元のラインを取得する prgbDst := bmpDst.ScanLine[y + pointDst.y]; Inc(prgbDst, rectDst.Left); // コピー先のラインを取得する prgbSrc := bmpSrc.ScanLine[y]; Inc(prgbSrc, rectSrc.Left); for x := rectSrc.Left to rectSrc.Right - 1 do begin // ソースビットマップのピクセルが背景色でない場合にコピーする if ((DWORD(prgbSrc^)and $ffffff) <> DWORD(rgbBkg))then begin // ピクセルを透過率つきでコピーする prgbDst^.rgbRed := ((prgbDst^.rgbRed * RTrns) + (prgbSrc^.rgbRed * (255 - RTrns)))div 255; prgbDst^.rgbGreen := ((prgbDst^.rgbGreen * GTrns) + (prgbSrc^.rgbGreen * (255 - GTrns)))div 255; prgbDst^.rgbBlue := ((prgbDst^.rgbBlue * BTrns) + (prgbSrc^.rgbBlue * (255 - BTrns)))div 255; end; Inc(prgbDst); Inc(prgbSrc); end; end; end; end; // 使用例 procedure TForm1.Button1Click(Sender: TObject); var bmpDst, bmpSrc: TBitmap; clTransparency: TColor; begin bmpDst := TBitmap.Create; bmpSrc := TBitmap.Create; bmpDst.LoadFromFile('c:\Windows\雲.bmp'); bmpSrc.LoadFromFile('c:\Windows\花見.bmp'); clTransparency := RGB(128,128,128); // 透過率 50% CopyBitmapWithTransparency(bmpDst, POINT(100, 0), bmpSrc, clTransparency, bmpSrc.TransparentColor); // 透過張り付けしたビットマップをフォームに描画する Canvas.Draw(0,0, bmpDst); bmpDst.Free; bmpSrc.Free; end;  以上です。 1998/01/15、河邦 正(GCC2240@niftyserve.or.jp) Original document by 河邦 正 氏 ID:(GCC02240)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum