使用Graphics32创建剪贴蒙版

时间:2012-01-22 20:48:19

标签: delphi graphics32

我正在使用Graphics32进行图像处理。看看它的功能,让我觉得我还没有看到剪贴蒙版的正确实现。我确实看到“剪辑”一词在这里和那里弹出,但它似乎指的是别的东西。

简单地说,我需要一层作为另一层的“窥视孔”;应将A层投影到B层,但仅限于B层可见的地方。 (我认为没有必要重新定义剪贴蒙版是什么。)

如果它只是我要呈现的那个其他图层的位图,那就不会那么难了 - 那么我可以使用this trick - 但是使事情变得复杂的是位图层的含义并不能说明层的显示内容;该图层可以是:

  • (部分)不可见(在视图外)
  • 移动/拉伸+可选重新采样
  • 旋转

对其位图没有影响。

实际上是不是没有现成的实现?有什么建议吗?

的进展

我在Graphics32的源代码中找到了一些有用的元素。例如,使用此声明:

type
  TLayerAccess = class(TBitmapLayer);

要获得对受保护方法的访问权限,我可以调用TLayerAccess(ABitmapLayer).Paint(ABitmap32)将此图层绘制为位图,就像对待屏幕一样。

2 个答案:

答案 0 :(得分:0)

查看TByteMap及其writeTo方法。

答案 1 :(得分:0)

一年前我自己研究过这个问题,很快就采用了透明部分的黑色层。它适合我当时的需要。但你想要的是什么......

您想将一个TBitmapLayer耦合到另一个并将其视为掩码。我想避免这些引用(及其潜在的问题和Graphics32返工),并将此视为最后的手段。

如果没有专用的TBitmapLayer,可以使用自己的像素合并器。但它不知道TBitmapLayers及其XY像素。

要在绘制到屏幕时正确遮挡(或遗漏)部分TBitmapLayer,您可以使用创建type TPixelCombineEvent的方法并将其指定为OnPixelCombine并设置{{ 1}}到TBitmapLayer.DrawMode

dmCustom方法中,您可以根据当前TPixelCombineEvent主alpha给出背景B和前景F来确定哪些像素结果。

M

这里的问题是,(伪代码)PseudoThisPixelShouldBeMasked并不真正知道这关注的是什么像素以及它是否在掩码中。因此,您必须从procedure TMyObj.MyPixCombine(F: TColor32; var B: TColor32; M: TColor32); begin if not PseudoThisPixelShouldBeMasked then B := F; // ugly and aliased end; 的组件中提取该值,例如其Alpha值。

当时我选择了相当快的F,其中F是黑色或白色。此图层始终位于顶部,然后导致黑色而不是透明蒙版。 这是因为对B := ColorMin(F,B);的任何渲染都会破坏掩码数据,我需要重新应用它。然而,使用TBitmapLayer,如下所示(由iamjoosy贬低?)可能会很有趣,也许性能损失可以忽略不计。