2012-01-22 87 views
2

我正在使用Graphics32進行圖像處理。看看它的功能,這讓我覺得我還沒有看到剪貼蒙版的正確實現。我確實看到「裁剪」這個詞在這裏和那裏出現,但它似乎指的是別的東西。使用Graphics32創建剪貼蒙版

簡而言之,我需要一個圖層作爲另一個「窺視孔」的功能;層A應投影到層B上,但只能在層B可見的位置。 (我再也不需要重新定義一個剪貼蒙版了。)

如果它只是我想呈現的那個其他圖層的位圖,那麼它不會那麼難 - 然後我可以使用this trick - 但是事情的複雜性在於,圖層的位圖並沒有講述圖層顯示的內容。該層可以是:

  • (部分地)不可見的(當從圖的)
  • 移動/拉直+任選重採樣
  • 旋轉

在其位圖沒有影響。

實際上是否這樣沒有現成的實現呢?任何建議自己做這個?

進展

我發現Graphics32的源一些有用的元素。例如,使用此聲明:

type 
    TLayerAccess = class(TBitmapLayer); 

才能訪問受保護的方法,我可以叫TLayerAccess(ABitmapLayer).Paint(ABitmap32)有這只是塗上一層爲位圖,正是因爲它會在屏幕上。

+0

graphics32僅使用32nit位圖,它是用於混合的位圖的Alpha通道。我不知道你可以使用的另一個字段(例如裁剪區域等)。你只有另一個「主阿爾法」。我會。 1.確定阿爾法位圖(全白,阿爾法通道是位圖座標中的剪切路徑),將原始位圖相乘到該位圖中,然後將位圖渲染到目的地。 –

+0

如何定義圖層B的哪些部分可見? – iamjoosy

+0

@iamjoosy我可以在容器中繪製時看到它(TImage32)。 –

回答

0

一年前我已經研究過這個問題,並且很快採用了透明部分的黑色圖層。它適合我當時的需求。但你想要什麼是可能的。

你想要將一個TBitmapLayer耦合到另一個TBITmapLayer並將其視爲其掩碼。然而,我想避免這些引用(及其潛在的問題和Graphics32返工),並且僅將這看作是最後的手段。

有一種方法可以在沒有專用的TBitmapLayer的情況下使用自己的像素合成器。但它不知道TBitmapLayers及其XY像素。

適當的封堵器(或離開了)一個TBitmapLayer的部分,而繪製屏幕,​​你可以使用創建的type TPixelCombineEvent的方法和分配這爲OnPixelCombine和設置TBitmapLayer.DrawModedmCustom

內部的TPixelCombineEvent方法決定結果像素給出什麼樣的背景B並考慮到目前M主阿爾法前景F。這裏

procedure TMyObj.MyPixCombine(F: TColor32; var B: TColor32; M: TColor32); 
begin 
    if not PseudoThisPixelShouldBeMasked then B := F; // ugly and aliased 
end; 

問題是,(僞代碼)PseudoThisPixelShouldBeMasked並不真正知道什麼是像素這個問題和它是否是一個面罩內。因此,您必須從F的組件中提取該值,例如Alpha值。

當時我選擇了相當快的B := ColorMin(F,B);其中F是黑色或白色。該圖層始終位於頂部,但會導致黑色而不是透明蒙版。 這是因爲任何渲染到TBitmapLayer都會破壞蒙版數據,我需要重新應用它。然而,使用TByteMap(如下面的建議)(誰低估了?)by iamjoosy可能會很有趣,也許性能損失可以忽略不計。