Delphi - Graphics32,在JPG上绘制多个透明PNG作为水印
Delphi - Graphics32, draw multiple transparent PNG over JPG as watermak
阅读 Graphics32 文档后,我找不到使用图层的客观示例。
我只想合成下图:
- 第 1 层 - 背景图像(JPG 格式)(800x600)
- 第 2 层 - 透明 PNG 作为边框 (800x600)
- 第 3 层 - 右下角透明 PNG,旋转 25º (90x90)
这是预期的结果:
// uses => GR32, GR32_Layers, GR32_Png, GR32_Image;
procedure TMain.Button1Click(Sender: TObject);
var
// src, dest: TPNGObject; <-- another frustrating try
// r: TRect;
bmp: TBitmap32;
png: TPortableNetworkGraphic32;
rlayer: TCustomLayer;
img1, img2, img3: TImgView32;
begin
bmp := TBitmap32.Create;
bmp.Assign(imgPreview.Picture); // TImage obj already have a JPG loaded
img1 := TImgView32.Create(nil);
img1.Bitmap := bmp;
img2 := TImgView32.Create(nil);
img2.Bitmap.LoadFromFile('C:\layer2.png');
img3 := TImgView32.Create(nil);
img3.Bitmap.LoadFromFile('C:\watermark.png');
rlayer := TCustomLayer.Create(nil);
rlayer.LayerCollection.Add(img1.Layers.Items[0]); // [DCC Error] Incompatible types: 'TLayerClass' and 'TCustomLayer' ????
...
如何向 collection 添加新图层?毕竟,我该如何保存呢?
LayerCollection.Add
方法期望接收 TLayerClass
类型的值。也就是说,它想要接收 class,而不是 class 的 实例 。为了让编译器满意,直接传TCustomLayer
;该集合将实例化给定的 class 本身。它将 return 实例引用。在 GR32_Layers.pas.
中亲自查看
但是,您一开始就采取了错误的方法。 TBitmap32
对象没有图层。 TImage32
组件具有层,如果您不仅要同时显示多个位图层,而且还允许用户与层进行交互,这很有用;您可以使用 HitTest
方法检测哪一层是哪一层,如 layer overview 中所述。每层由一个图形组成;对于位图,您可能想使用 TBitmapLayer
,而不仅仅是 TCustomLayer
.
只是为了创建一个新的位图,您根本不需要图层。 (只要您使用的是能够理解 PNG 图像的 Delphi 版本,我敢肯定您甚至不需要 Graphics32。)相反,只需从空白位图开始。在需要去的地方绘制主位图,然后绘制框架位图,然后绘制图章位图。最后,保存位图。
除非您实际上要在表单上显示所有单独的位图,否则不需要那些 TImgView32
组件。该组件用于在屏幕上显示带有滚动条的图像。
阅读 Graphics32 文档后,我找不到使用图层的客观示例。
我只想合成下图:
- 第 1 层 - 背景图像(JPG 格式)(800x600)
- 第 2 层 - 透明 PNG 作为边框 (800x600)
- 第 3 层 - 右下角透明 PNG,旋转 25º (90x90)
这是预期的结果:
// uses => GR32, GR32_Layers, GR32_Png, GR32_Image;
procedure TMain.Button1Click(Sender: TObject);
var
// src, dest: TPNGObject; <-- another frustrating try
// r: TRect;
bmp: TBitmap32;
png: TPortableNetworkGraphic32;
rlayer: TCustomLayer;
img1, img2, img3: TImgView32;
begin
bmp := TBitmap32.Create;
bmp.Assign(imgPreview.Picture); // TImage obj already have a JPG loaded
img1 := TImgView32.Create(nil);
img1.Bitmap := bmp;
img2 := TImgView32.Create(nil);
img2.Bitmap.LoadFromFile('C:\layer2.png');
img3 := TImgView32.Create(nil);
img3.Bitmap.LoadFromFile('C:\watermark.png');
rlayer := TCustomLayer.Create(nil);
rlayer.LayerCollection.Add(img1.Layers.Items[0]); // [DCC Error] Incompatible types: 'TLayerClass' and 'TCustomLayer' ????
...
如何向 collection 添加新图层?毕竟,我该如何保存呢?
LayerCollection.Add
方法期望接收 TLayerClass
类型的值。也就是说,它想要接收 class,而不是 class 的 实例 。为了让编译器满意,直接传TCustomLayer
;该集合将实例化给定的 class 本身。它将 return 实例引用。在 GR32_Layers.pas.
但是,您一开始就采取了错误的方法。 TBitmap32
对象没有图层。 TImage32
组件具有层,如果您不仅要同时显示多个位图层,而且还允许用户与层进行交互,这很有用;您可以使用 HitTest
方法检测哪一层是哪一层,如 layer overview 中所述。每层由一个图形组成;对于位图,您可能想使用 TBitmapLayer
,而不仅仅是 TCustomLayer
.
只是为了创建一个新的位图,您根本不需要图层。 (只要您使用的是能够理解 PNG 图像的 Delphi 版本,我敢肯定您甚至不需要 Graphics32。)相反,只需从空白位图开始。在需要去的地方绘制主位图,然后绘制框架位图,然后绘制图章位图。最后,保存位图。
除非您实际上要在表单上显示所有单独的位图,否则不需要那些 TImgView32
组件。该组件用于在屏幕上显示带有滚动条的图像。