我想做一个游戏的辅助工具,简单描述下抓取不可行走区域的功能:
先load一张大地图,然后在地图上面直接画矩形图,记录下矩形的左上跟右下脚坐标。稍做转换可得到一块关于不可行走区域的范围的数据
问题:如何在BMP档上画一个半透明的矩形,并且这个矩形可以移动,可以改变大小?
请高手指点,谢谢
先load一张大地图,然后在地图上面直接画矩形图,记录下矩形的左上跟右下脚坐标。稍做转换可得到一块关于不可行走区域的范围的数据
问题:如何在BMP档上画一个半透明的矩形,并且这个矩形可以移动,可以改变大小?
请高手指点,谢谢
这样说不知道楼上的明白吗?
还有一个比较复杂的方法,就是你要直接在大图上绘制,但是基本的理论还是和上面一样,不过你必须将大图上覆盖的部分保存起来,以全球还原。而且要实现拖动的话,还要对鼠标控制。
如果你只想做50%的半透明的话。半透明的算法就比较的简单。R = (R1+R2) shr 1,G、B也如此(R为结果。R1和R2分别为目标与源),当然就是要一个点一个点的运算。位图的话,用scanline比较快一些。如果不想麻烦的话,找一些现成的函数也是不错的选择,如GDI+
function IntToByte(i: Integer): Byte;
begin
if i > 255 then
Result := 255
else if i < 0 then
Result := 0
else
Result := i;
end;procedure BmpAlphaBlend(var dBmp: TBitMap; sBmp: TBitmap; Pos: TPoint; Alpha: integer; TranColor: TColor = -1);
type
tagRGBTRIPLE = packed record
rgbtBlue: Byte;
rgbtGreen: Byte;
rgbtRed: Byte;
end;
TRGBTriple = tagRGBTRIPLE;
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[0..32767] of TRGBTriple;
function GetSLColor(pRGB: TRGBTriple): TColor;
begin
Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
end;
var
p0, p1: PRGBTripleArray;
r, g, b, p, x, y: Integer;
begin
sBmp.PixelFormat := pf24bit;
dBmp.PixelFormat := pf24bit;
if TranColor = -1 then
TranColor := sBmp.Canvas.Pixels[0, 0];
for y := 0 to sBmp.Height - 1 do
if (y + Pos.y >= 0) and (y + Pos.Y < dBmp.Height) then
begin
p0 := dBmp.ScanLine[y + Pos.y];
p1 := sBmp.ScanLine[y];
for x := 0 to sBmp.Width - 1 do
if (x + pos.X >= 0) and (x + Pos.X < dBmp.Width) then
if GetSLCOlor(p1[x]) <> TranColor then
begin
p0[x + pos.X].rgbtRed := IntToByte((p0[x + pos.X].rgbtRed * (100 - Alpha) +
p1[x].rgbtRed * Alpha) div 100); p0[x + pos.X].rgbtGreen := IntToByte((p0[x + pos.X].rgbtGreen * (100 - Alpha) +
p1[x].rgbtGreen * Alpha) div 100); p0[x + pos.X].rgbtBlue := IntToByte((p0[x + pos.X].rgbtBlue * (100 - Alpha) +
p1[x].rgbtBlue * Alpha) div 100);
end;
end;end;procedure TForm1.Button1Click(Sender: TObject);
var
brBmp, srcBmp: TBitmap;
begin
//
brBmp := TBitmap.Create;
brBmp.LoadFromFile('c:\a.bmp');
brBmp.PixelFormat := pf24bit; srcBmp := TBitmap.Create;
srcBmp.LoadFromFile('c:\bmp');
srcBmp.PixelFormat := pf24bit; BmpAlphaBlend(
brBmp, //背景图(大图,也是结果图)
srcBmp, //需要合成的小图
Point(60, 60), //画小图的坐标
100, //半透明度
-1//需要透明的颜色(用于不规则图形,-1就表示以0,0位置的颜色为透明色)
); canvas.Draw(0, 0, brBmp);
brBmp.Free;
srcBmp.Free;
end;把偶精心研究的都拿出来了,楼主应该把分全给我吧:)
半透明,就是“淡”一点,如果一点不淡,那就是全透明了。
你可以试试各种不同的值来与原来的R,G,B作平均,看用哪一个值最满意。
使此点的颜色变成: (R0+R)/2,(G0+G)/2,(B0+B)/2都能使图像变成半透明。
因为看一大片代码不如了解原理方便。
A分量(alpha分量)的设置来实现透明。alpha=0为全透明,alpha=1为全不透明,alpha=0.5为半透明