我正在使用Graphics32进行图像处理。看看它的功能,让我觉得我还没有看到剪贴蒙版的正确实现。我确实看到“剪辑”一词在这里和那里弹出,但它似乎指的是别的东西。
简单地说,我需要一层作为另一层的“窥视孔”;应将A层投影到B层,但仅限于B层可见的地方。 (我认为没有必要重新定义剪贴蒙版是什么。)
如果它只是我要呈现的那个其他图层的位图,那就不会那么难了 - 那么我可以使用this trick - 但是使事情变得复杂的是位图层的含义并不能说明层的显示内容;该图层可以是:
对其位图没有影响。
实际上是不是没有现成的实现?有什么建议吗?
我在Graphics32的源代码中找到了一些有用的元素。例如,使用此声明:
type
TLayerAccess = class(TBitmapLayer);
要获得对受保护方法的访问权限,我可以调用TLayerAccess(ABitmapLayer).Paint(ABitmap32)
将此图层绘制为位图,就像对待屏幕一样。
答案 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贬低?)可能会很有趣,也许性能损失可以忽略不计。