2012-01-22 123 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可能会很有趣,也许性能损失可以忽略不计。