求都各位大神,如何使用掩码位图合成透明的图片? 例如图片1,加图片2(掩码图片),如何得到图片3的效果?图片3就只是显示中间,周围都是透明或半透明的,这样就可以得到一个边缘光滑的图片效果。请求各大神能赐教,最好能有代码,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 忘记了说,我使用的是delphi7,拜谢各位大神了 函数BitBlt,两次,第一次绘制正确图片用srcCopy参数,第二次绘制掩码图片,用srcand与一下 bitblt(image3.Picture.Bitmap.Canvas.Handle, 0, 0, 23, 22, image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);bitblt(image3.Picture.Bitmap.Canvas.Handle, 0, 0, 23, 22, image2.Picture.Bitmap.Canvas.Handle, 0, 0, SRCAND);image3.Refresh;请问是不是这样?但没有效果啊。用bitblt已经反反复复各种方式都试过,都没有预期的效果。这个掩码图,应该是图1根据图2的颜色,图2是黑色时,图1对应的像素就透明,灰色时,就半透明,根据灰度值决定透明程度吧? http://hi.baidu.com/aclshysmtfbdefd/item/3b68780175fd5beb3599029b 用 GDI+, 先画 背景 ,再画 位图。 var I, Count: Integer; Clsid: TClsid; Image: TGpImage; bkImage: TGpImage; Attr: TGpImageAttributes; bmp: TGpBitmap; tmp: TGpBitmap; tg, bg: TGpGraphics; GUID: TGUID;begin // 打开图像文件 Image := TGpImage.Create('e:\01.png'); BkImage := TGpImage.Create('e:\bk.png'); tmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB); tg := TGpGraphics.Create(tmp); bmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB); bg := TGpGraphics.Create(bmp); Attr := TGpImageAttributes.Create; try // 设置透明色范围 Attr.SetColorKey($FFffffff, $FFffffff); Image.GetFrameDimensionsList(@GUID, 1); // 获取图像祯数 Count := Image.GetFrameCount(GUID); GetEncoderClsid('image/png', Clsid); for I := 0 to Count - 1 do begin // 选择激活祯 Image.SelectActiveFrame(GUID, I); // 画当前祯到临时图 tg.DrawImage(Image, 0, 0, Image.Width, Image.Height); // 合成图初始化为透明色 bg.Clear(0); // 画背景图,如不需要背景图,可将下面注释掉 bg.DrawImage(BkImage, 0, 0, bmp.Width, bmp.Height); // 画临时图 bg.DrawImage(tmp, GpRect(0, 0, bmp.Width, bmp.Height), 0, 0, tmp.Width, tmp.Height, utPixel, Attr); // 保存 bmp.Save('e:\01-' + IntToStr(I) + '.png', Clsid); end; finally Attr.Free; bg.Free; bmp.Free; tg.Free; tmp.Free; BkImage.Free; Image.Free; end; 2次 非与或 NotXOR cxgrid 如何根据某列的值合并单元格 初学者请各位大哥帮帮小弟 送分来了!!! 在做系统帮助的时候有了一个新的思路,请大家讨论讨论 我如何获取树的枝叶信息。 大侠们帮我找一把进门的钥匙 谢谢! 求教:给家里装个监控摄像头,需要在远处网上能看到家里的情况 这句话到底该怎样写 窗口如何自动关闭,帮忙看一下,先谢各位了 《Delphi深度探索》怎么样哈? delphi 如何获取真实下载地址 idhttpserver如何接收post过来的文件呢?
用bitblt已经反反复复各种方式都试过,都没有预期的效果。这个掩码图,应该是图1根据图2的颜色,图2是黑色时,图1对应的像素就透明,灰色时,就半透明,根据灰度值决定透明程度吧?
I, Count: Integer;
Clsid: TClsid;
Image: TGpImage;
bkImage: TGpImage;
Attr: TGpImageAttributes;
bmp: TGpBitmap;
tmp: TGpBitmap;
tg, bg: TGpGraphics;
GUID: TGUID;
begin
// 打开图像文件
Image := TGpImage.Create('e:\01.png');
BkImage := TGpImage.Create('e:\bk.png');
tmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB);
tg := TGpGraphics.Create(tmp);
bmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB);
bg := TGpGraphics.Create(bmp);
Attr := TGpImageAttributes.Create;
try
// 设置透明色范围
Attr.SetColorKey($FFffffff, $FFffffff);
Image.GetFrameDimensionsList(@GUID, 1);
// 获取图像祯数
Count := Image.GetFrameCount(GUID);
GetEncoderClsid('image/png', Clsid); for I := 0 to Count - 1 do
begin
// 选择激活祯
Image.SelectActiveFrame(GUID, I);
// 画当前祯到临时图
tg.DrawImage(Image, 0, 0, Image.Width, Image.Height);
// 合成图初始化为透明色
bg.Clear(0);
// 画背景图,如不需要背景图,可将下面注释掉
bg.DrawImage(BkImage, 0, 0, bmp.Width, bmp.Height);
// 画临时图
bg.DrawImage(tmp, GpRect(0, 0, bmp.Width, bmp.Height),
0, 0, tmp.Width, tmp.Height, utPixel, Attr);
// 保存
bmp.Save('e:\01-' + IntToStr(I) + '.png', Clsid);
end;
finally
Attr.Free;
bg.Free;
bmp.Free;
tg.Free;
tmp.Free;
BkImage.Free;
Image.Free;
end;