问题如下:
有三个图片控件,image1,image2,image3,image4 大小为image1(200,200),image2(200,200),image3(1000,1000),image4(5,5) 我想把image1与image2的图片,结何实现透明,并且把每一点放大5倍,放到image3上.我的思路是: 对image1,image2每一点读出来,并且扩大该点为5倍大小,即为(5,5)加以混合运算实现半稳明,然后把该点(5*5)大小的图片拷贝到image3上,请问我的思路是否正确呢?
我用上面这种思路编写了一段程序,程序结构如下:
for x:=0 to 199 do begin
for y:=0 t0 199 do begin
(1) 我根据y的值为透明值,
(2) 现在我(x,y)点读出,使image4的色素为(x,y)点的色素,而且要使image4为透明.透明值为 y ,
{ 上面我为了实现 image4 透明,又加了两个for循环
for xx:=0 to 4 do begin
for yy:=0 to 4 begin
end;
end;
}
(3) 现在就把image4的图片拷贝到image3上去.
end;
end;
小弟把整个程序写完,但加载速度有点慢.所以来请教高手,实现上面的功能思路上有没有更好的解决方法呢? 高手们可以说一说你们更好的想法呢? 从算法上能否在修改修改呢?
有三个图片控件,image1,image2,image3,image4 大小为image1(200,200),image2(200,200),image3(1000,1000),image4(5,5) 我想把image1与image2的图片,结何实现透明,并且把每一点放大5倍,放到image3上.我的思路是: 对image1,image2每一点读出来,并且扩大该点为5倍大小,即为(5,5)加以混合运算实现半稳明,然后把该点(5*5)大小的图片拷贝到image3上,请问我的思路是否正确呢?
我用上面这种思路编写了一段程序,程序结构如下:
for x:=0 to 199 do begin
for y:=0 t0 199 do begin
(1) 我根据y的值为透明值,
(2) 现在我(x,y)点读出,使image4的色素为(x,y)点的色素,而且要使image4为透明.透明值为 y ,
{ 上面我为了实现 image4 透明,又加了两个for循环
for xx:=0 to 4 do begin
for yy:=0 to 4 begin
end;
end;
}
(3) 现在就把image4的图片拷贝到image3上去.
end;
end;
小弟把整个程序写完,但加载速度有点慢.所以来请教高手,实现上面的功能思路上有没有更好的解决方法呢? 高手们可以说一说你们更好的想法呢? 从算法上能否在修改修改呢?
解决方案 »
- Delphi 数据库Table 过滤器
- 问问题好艰难呀,半天了没人回答,是不是我分少了,我没分给了呀,用完了
- 求助!!!
- if adoQuery.first then这句话为什么有错,报错“type of expression must be BOOLEAN”,急,在线等待
- 用bde的数据库应用程序,如何防止运行时跳出登录对话框?
- 高手请进!!100分求解
- 如何得知TEdit控件中的内容是否用“*”号代替??
- 如何将service application服务程序做成一个小图标放在系统托盘栏里
- 求用Delphi 编写的自动发邮件源码
- 一个BDE初始化问题...
- 一个使用TCustomControl做控件的问题
- 一个使用TCustomControl做控件的问题
//通常使用TBitmap.ScanLine[]属性~~
//参考如下代码~~function BitmapGridPoint(mBitmap: TBitmap; mOffset: Boolean;
mTransparentColor: TColor): Boolean;
var
X, Y: Integer;
vRGBTriple: PRGBTriple;
vTransparent: TRGBTriple;
vOldPixelFormat: TPixelFormat;
begin
Result := False;
if not Assigned(mBitmap) then Exit;
vOldPixelFormat := mBitmap.PixelFormat;
try
mTransparentColor := ColorToRGB(mTransparentColor);
vTransparent.rgbtBlue := GetBValue(mTransparentColor);
vTransparent.rgbtRed := GetRValue(mTransparentColor);
vTransparent.rgbtGreen := GetGValue(mTransparentColor); mBitmap.PixelFormat := pf24bit;
for Y := 0 to mBitmap.Height - 1 do begin
vRGBTriple := mBitmap.ScanLine[Y];
for X := 0 to mBitmap.Width - 1 do begin
if Odd(X) xor Odd(Y) xor mOffset then
vRGBTriple^ := vTransparent;
Inc(vRGBTriple);
end;
end;
finally
mBitmap.PixelFormat := vOldPixelFormat;
end;
Result := True;
end; { BitmapGridPoint }
节省的时间很可观了。放大操作没什么好说的。zswang(伴水清清)(专家门诊清洁工) 给出了函数使用方法。你要放大5倍。注意一下是扫一行源位图就要连续扫5 行目标位图。读一个源像素,就要写5个目标像素。循环需要注意点。