最近很多小伙伴都在问delphi–如何从32bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓
最近很多小伙伴都在问delphi – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Delphi 7,如何将Paintbox内容复制到Tbitmap?、delphi JBitmapBitmap互转转换、Delphi TBitmap – 为什么Pixels和ScanLine不同?、Delphi TBitMap 位图组件等相关知识,下面开始了哦!
本文目录一览:- delphi – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?
- Delphi 7,如何将Paintbox内容复制到Tbitmap?
- delphi JBitmapBitmap互转转换
- Delphi TBitmap – 为什么Pixels和ScanLine不同?
- Delphi TBitMap 位图组件
delphi – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?
但是,当其句柄引用时,具有(PixelFormat = pf32bit)和(AlphaFormat = afDefined)(表现为其他目的的alpha混合)的TBitmap实例不会被识别为用于创建图标或光标的有效alpha混合位图.
目前,我必须使用描述的API调用(see)创建TBitmap的完整副本,以使CreateIconIndirect接受位图处理作为alpha混合.我该如何克服这种笨拙?
解决方法
procedure TForm1.Button1Click(Sender: TObject); const crAlpha = TCursor(-25); var Bmp: TBitmap; Px: PRGBQuad; X,Y: Integer; BmpMask: TBitmap; II: TIconInfo; AlphaCursor: HCURSOR; begin Bmp := TBitmap.Create; Bmp.PixelFormat := pf32bit; Bmp.Canvas.Brush.Color := clWhite; Bmp.SetSize(32,32); Bmp.Canvas.Font.Style := [fsBold]; Bmp.Canvas.Font.Color := clRed; Bmp.Canvas.textout(1,10,'alpha'); for Y := 0 to (Bmp.Height - 1) do begin Px := Bmp.ScanLine[Y]; for X := 0 to (Bmp.Width - 1) do begin if DWORD(Px^) = DWORD(clWhite) then Px.rgbReserved := $00 else Px.rgbReserved := $FF; Inc(Px); end; end; BmpMask := TBitmap.Create; BmpMask.SetSize(Bmp.Width,Bmp.Height); II.fIcon := False; II.xHotspot := 32; II.yHotspot := 32; II.hbmMask := BmpMask.Handle; II.hbmColor := Bmp.Handle; AlphaCursor := CreateIconIndirect(II); Win32Check(AlphaCursor <> 0); BmpMask.Free; Bmp.AlphaFormat := afDefined; // AlphaBlend below,premultiply channels Canvas.Draw(0,Bmp); // test draw Bmp.Free; Screen.Cursors[crAlpha] := AlphaCursor; Cursor := crAlpha; end;
(顶部’alpha’是测试绘图,另一个是光标)
Delphi 7,如何将Paintbox内容复制到Tbitmap?
像这样
public { Public declarations } BitMap : TBitmap; end;
我有一个声明为公共的Tbitmap,我像这样创建onFormCreate
procedure TForm1.FormCreate(Sender: TObject); begin BitMap := TBitMap.Create; end;
然后我像这样在位图上绘制一些东西
procedure TForm1.DrawOnPainBox; begin If BitMap.Width <> PaintBox1.Width then BitMap.Width := PaintBox1.Width; If BitMap.Height <> PaintBox1.Height then BitMap.Height := PaintBox1.Height; BitMap.Canvas.Rectangle(0,random(PaintBox1.Width ),random(PaintBox1.Height)); PaintBox1.Canvas.Draw(0,BitMap); end;
with PaintBox1.Canvas.Draw(0,BitMap);我们可以在一个paintBox中显示Bitmap中的内容但是相反的方法是什么?
如何将一个paintBox的内容分配/复制到位图?
`BitMap:=PaintBox1.Canvas.Brush.Bitmap;`
这编译,但如果我这样做,再次调用过程TForm1.DrawOnPainBox;我得到访问违规和调试器显示位图和PaintBox1.Canvas.Brush.Bitmap即使在paintBox上绘制了一些行
解决方法
Bitmap.Width := PaintBox1.Width; Bitmap.Height := PaintBox1.Height; BitBlt(Bitmap.Canvas.Handle,Bitmap.Width,Bitmap.Height,PaintBox1.Canvas.Handle,SRCcopY);
注意:在较新版本的Delphi中,您可以使用Bitmap.SetSize而不是Bitmap.Width和Bitmap.Height.
delphi JBitmapBitmap互转转换
总结
以上是小编为你收集整理的delphi JBitmapBitmap互转转换全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Delphi TBitmap – 为什么Pixels和ScanLine不同?
然后我将值设置为红色,只是发现它显示为蓝色.
知道为什么吗?
这是一段代码摘录:
procedure TForm1.FormPaint(Sender: TObject); var varBitmap: TBitmap; pLock: PIntegerArray; iColor: integer; begin varBitmap := TBitmap.Create; varBitmap.PixelFormat := pf32bit; varBitmap.Width := 800; varBitmap.Height := 600; // Set Pixels to Red varBitmap.Canvas.Pixels[0,0] := $0000FF; // Shows $FF0000 (blue) pLock := varBitmap.ScanLine[0]; iColor := pLock[0]; ShowMessageFmt('%x',[iColor]); // Set ScanLine to Red pLock[0] := $0000FF; // displays a blue pixel Canvas.Draw(0,varBitmap); end;
似乎TColor与内存中的内容不同,但这没有任何意义.
欢迎任何建议.
总结
以上是小编为你收集整理的Delphi TBitmap – 为什么Pixels和ScanLine不同?全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Delphi TBitMap 位图组件
TBitMap对象支持从文件、剪贴板、流中存取位图。
1.TBitMap组件的典型用法
TBitMap组件在应用之前,首先要对此类型定义一个变量,然后就可以对组件进行操作了。以下代码就是一个TBitMap组件建立、应用、释放的全过程,功能是读取一个位图文件,然后将图绘制到Form1窗体上。
var
BMP:TBitMap;
begin
BMP:=TBitMap.Create;
BMP.LoadFromFile(’C:\Windows\Soap Bubbles.bmp’);
Form1.Canvas.Draw(50,50,BMP);
BMP.Free;
end;
2.TBitMap组件的重要属性
Canvas-------------位图从这个画布上输出
Empty--------------此属性用于判断位图是否为空
Handle-------------此属性返回位图的句柄
HandleType---------位图如果是设备无关的,此属性返回bmDIB,如果位图是依赖于设备的,此属性返回bmDDB
Height-------------此属性用于设置位图的高度
Width--------------此属性用于设置位图的宽度
Monochrome---------位图是单色还是彩色
PixelFormat--------此属性用于设置位图的内存格式和颜色深度
TransparentColor---此属性用于设置或返回把位图显示成透明的颜色
Transparent--------此属性决定是否把
TransparentColor---属性设置的颜色透明显示
(1)Empty属性
此属性用于判断位图是否为空。
Empty属性是一个布尔型,如果位图为空则返回True值,否则返回False值。
(2)Height属性和Width属性
这两个属性分别用于设置位图的高度和宽度。这两个属性必须在TBitMap组件调入图片后进行设置才能起到限定大小的作用。
(3)Monochrome属性
此属性决定位图是单色还是彩色。
TBitMap组件调入图片后,将Monochrome属性设置为True后,只要图像中的颜色不是白色的地方都将变成黑色,如果再将Monochrome属性设置为False,图像也不能还原成以前的彩色图像了。
(4)PixelFormat属性
此属性用于设置位图的内存格式和颜色深度。设定了如下9个用户可选值。
. pfDevice:与设备有关。
. pf1bit:1bit颜色。
. pf4bit:4bit颜色。
. pf8bit:8bit颜色。
. pf15bit:15bit颜色。
. pf16bit:16bit颜色。
. pf24bit:24bit颜色。
. pf32bit:32bit颜色。
. pfCustom:定制颜色。
(5)TransparentColor属性
此属性用于设置图像可以透明的颜色。例如要将图像中的黑色部分以透明方式显示,那么TransparentColor属性就可以赋值为clBlack,并将Transparent属性设置为True。
3.TBitMap组件的重要方法
Asign--------------------此方法将其他格式的图像转换为位图格式
Create-------------------此方法将建立一个新的TBitMap对象
Free---------------------此方法释放TBitMap组件
FreeImage----------------此方法能够减少位图占用的内存
LoadFromClipformat-------此方法用于从剪贴板中获取一个位图
Mask---------------------此方法可以把位图变成单色的
SavetoClipboardFormat----此方法用于把一个位图保存到剪贴板
(1)Asign方法
此方法用于转换图像格式的。例如将timage组件调入一个BMP格式的的图像,可以利用Assign方法将timage组件的图像传递给TBitMap变量,整个过程如下:
var
BMP:TBitMap;
begin
BMP:=TBitMap.Create;
BMP.Assign(Image1.Picture.Bitmap);//对BMP进行操作
BMP.Free;
(2)Create方法
此方法是用来创建一个新的TBitMap对象的。其方法是首先声明一个TBitMap变量,然后利用Create方法建立,实例参见Asign方法中代码的前4行。
(3)Free方法
此方法用来释放TBitMap组件。程序运行时建立TBitMap组件后会占用一定的内存,如果在使用完TBitMap组件后不利用Free方法释放,这个TBitMap组件会常驻内存,直到程序运行结束,所以提倡在用完此组件后用Free方法释放它占用的内存。实例及格式参见Asign方法中代码的后数第2行。
(4)FreeImage方法
此方法能够减少位图占用的内存。TBitMap组件在调入图像后,可以利用此方法减少内存的占用,以后还可以继续使用TBitMap组件内的图像。
(5)LoadFromFile方法
此方法可以在运行时动态地调入扩展名应为.bmp的图像文件。其语法格式为:
BitMap.LoadFromFile('FileName');
(6)Mask方法
此方法可以把位图变成单色的。
Mask方法中包含一个TColor类型的参数TransparentColor,此参数是用来指定可以透明显示的颜色。除TransparentColor参数指定的颜色,其余的都将变成黑色。
(7)SavetoFile方法
此方法可以将TBitMap组件变量中的图像内容保存为BMP格式,其语法格式为:
BitMap.SavetoFile('FileName');
关于delphi – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Delphi 7,如何将Paintbox内容复制到Tbitmap?、delphi JBitmapBitmap互转转换、Delphi TBitmap – 为什么Pixels和ScanLine不同?、Delphi TBitMap 位图组件的相关知识,请在本站寻找。
本文标签: