Delphi - Graphics32,在JPG上绘制多个透明PNG作为watermak

时间:2015-09-23 13:27:51

标签: delphi graphics32

在阅读了Graphics32文档之后,我找不到使用图层的客观示例。

我只想撰写以下图片:

  • 第1层 - 背景图像(JPG)(800x600)
  • 第2层 - 透明PNG作为边框(800x600)
  • 第3层 - 右下方的透明PNG,旋转25º(90x90)

这是预期的结果:

enter image description here

// 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' ????

   ...

如何在集合中添加新图层?毕竟,我怎么能保存这个?

1 个答案:

答案 0 :(得分:4)

LayerCollection.Add方法希望获得类型为TLayerClass的值。也就是说,它希望接收,而不是类的实例。为了满足编译器,将其传递给字面 TCustomLayer;该集合将实例化给定的类本身。它将返回实例引用。请参阅GR32_Layers.pas

然而,你开始采取错误的方法。 TBitmap32个对象没有图层。 TImage32组件具有图层,如果您不仅要将多个位图图层一起显示,还允许用户与图层进行交互,这将非常有用。您可以使用HitTest方法检测哪个图层是哪个图层,如layer overview中所述。每层由一个图形组成;对于位图,您可能希望使用TBitmapLayer,而不仅仅是TCustomLayer

只是为了创建一个新的位图,您根本不需要图层。 (只要你使用了解PNG图像的Delphi版本,我很确定你甚至不需要Graphics32。)相反,只需要一个空白的位图。绘制需要去的主位图,然后绘制帧位图,然后绘制标记位图。最后,保存位图。

除非您实际要在表单上显示所有单独的位图,否则您不需要这些TImgView32组件。该组件用于使用滚动条在屏幕上显示图像。