1

阅读 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' ????

   ...

如何将新图层添加到集合中?毕竟,我该如何保存呢?

4

1 回答 1

4

LayerCollection.Add方法期望接收 type 的值TLayerClass。也就是说,它想要接收,而不是类的实例。为了满足编译器,按字面 TCustomLayer传递;该集合将实例化给定的类本身。它将返回实例引用。在GR32_Layers.pas中亲自查看。

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

只是为了创建一个新的位图,你根本不需要图层。(只要您使用的是能理解 PNG 图像的 Delphi 版本,我敢肯定您甚至不需要 Graphics32。)相反,只需从空白位图开始。在需要去的地方绘制主位图,然后绘制帧位图,然后绘制图章位图。最后,保存位图。

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

于 2015-09-23T14:06:45.673 回答