我正在使用Graphics32进行图像处理。从它的功能来看,我觉得我还没有看到一个适当的剪辑掩码的实现。我确实看到“剪裁”这个词出现在这里和那里,但它似乎是指其他的东西。
简单地说,我需要一个层作为一个“窥视孔”到另一个;层A应该投射到B层,但只有当B层是可见的。(我认为没有必要再重新定义剪辑掩码是什么。)
如果只是我想显示的另一层的位图,那就不难做了--那么我可以使用这个诡计 --但更复杂的是,图层的位图并不能说明图层将显示什么;图层可以是:
对它的位图没有影响。
这是否真的没有现成的实现呢?我自己有什么建议吗?
进展
我在Graphics32的源代码中找到了一些有用的元素。例如,使用此声明:
type
TLayerAccess = class(TBitmapLayer);为了获得对受保护方法的访问,我可以调用TLayerAccess(ABitmapLayer).Paint(ABitmap32)将这个层绘制到一个位图中,就像它在屏幕上所做的那样。
发布于 2012-01-23 15:53:13
看看TByteMap及其writeTo方法。
发布于 2013-03-12 09:45:01
一年前,我自己就研究过这个问题,很快就使用了一个带有透明部分的黑色图层。它适合我当时的需要。但你想要的是可能的..。
您希望将一个TBitmapLayer连接到另一个,并将其视为它的掩码。但是,我想避免这些引用(以及它的潜在问题和Graphics32返工),并且认为这只是最后的手段。
有一种方法可以不使用专用的TBitmapLayer,使用自己的像素组合器。但是它不知道TBitmapLayers和它的XY像素。
若要在绘图到屏幕时正确地封闭(或省略) TBitmapLayer的部分,可以使用创建TPixelCombineEvent的方法并将其赋值为OnPixelCombine,并将TBitmapLayer.DrawMode设置为dmCustom。
在该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 (谁否决了它?)通过iamjoosy,可能是有趣的,也许性能的惩罚是可以忽略不计的。
https://stackoverflow.com/questions/8964566
复制相似问题