2015-09-23 68 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) - 我正在閱讀圖層示例的源代碼來嘗試理解這個概念。謝謝! –