2

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

简而言之,我需要一层作为另一层的“窥视孔”;A 层应该投影到 B 层上,但只能在 B 层可见的地方。(我认为不再需要重新定义剪贴蒙版。)

如果它只是我想要呈现的另一层的位图,它不会那么难做 - 然后我可以使用这个技巧- 但让事情变得复杂的是,一个层的位图并不能说明很多关于图层将显示的内容;该层可以是:

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

对其位图没有影响。

是不是真的没有现成的实现呢?自己做这件事有什么建议吗?

进步

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

type
  TLayerAccess = class(TBitmapLayer);

为了访问受保护的方法,我可以调用TLayerAccess(ABitmapLayer).Paint(ABitmap32)将这一层绘制到位图上,就像在屏幕上一样。

4

2 回答 2

0

看看TByteMap及其 writeTo 方法。

于 2012-01-23T15:53:13.347 回答
0

一年前我自己对此进行了研究,并迅速采用了带有透明部分的黑色层。它适合我当时的需要。但是你想要的都是可能的。。

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

有一种方法可以不用专门的 TBitmapLayer,而是使用您自己的像素组合器。但它不知道 TBitmapLayers 及其 XY 像素。

要在屏幕上正确遮挡(或省略)部分TBitmapLayer绘图,您可以使用创建类型TPixelCombineEvent的方法并将其分配为它OnPixelCombine并设置TBitmapLayer.DrawModedmCustom.

在该方法中,您决定在给定背景和给定当前主 alpha的前景TPixelCombineEvent的情况下产生哪些像素。BFM

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都会破坏掩码数据,我需要重新应用它。但是,使用TByteMapiamjoosy 的如下建议(谁反对?)可能很有趣,也许性能损失可以忽略不计。

于 2013-03-12T09:45:01.073 回答