GVKun编程网logo

delphi – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?

21

最近很多小伙伴都在问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 – 如何从32 bpp的TBitmap实例创建alpha混合图标/光标(间接),而不是制作临时DIB部分?

根据 MS KB entry,CreateIconIndirect中存在一个怪癖,它识别HBITMAP是通过传递给CreateDIBSection(和BGRA通道布局)的BITMAPV5HEADER创建的.

但是,当其句柄引用时,具有(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?

Delphi 7,如何将Paintbox内容复制到Tbitmap?

我正在研究delphi 7,我想如何将TpaintBox的内容复制/分配给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上绘制了一些行

解决方法

要将TPaintBox的内容(让我们称之为PaintBox1)分配给TBitmap(比如说Bitmap),你可以做

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 JBitmapBitmap互转转换全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi TBitmap – 为什么Pixels和ScanLine不同?

Delphi TBitmap – 为什么Pixels和ScanLine不同?

使用32位TBitmap时,我从Canvas.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 位图组件

Delphi TBitMap 位图组件

位图组件(TBitMap)TBitMap组件不存在组件板,它封装了Windows的HBITMAP句柄和HPALETTE句柄,用于操纵位图和调色板。 
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 位图组件的相关知识,请在本站寻找。

本文标签: