2015-09-23 71 views
1

在阅读Graphics32文档后,我找不到使用图层的一个客观例子。德尔福 - Graphics32,绘制多个透明PNG作为watermak

只想组成以下图片:

  • 1层 - 背景图像(JPG)(800×600)
  • 二层 - 透明PNG作为帧边界(800×600)
  • 层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' ???? 

    ... 

我如何添加一个新图层,收藏?毕竟,我怎么能保存这个?

回答

4

LayerCollection.Add方法预计会收到类型为TLayerClass的值。也就是说,它想要接收,而不是实例的一个类。为了满足编译器的要求,从字面上传递TCustomLayer;该集合将自己实例化给定的类。它将返回的实例引用。请参阅GR32_Layers.pas

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

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

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

+0

我正在使用德尔福2007年(不支持本机PNG) - 我正在阅读图层示例的源代码来尝试理解这个概念。谢谢! –