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
|