首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Graphics32创建剪裁掩码

使用Graphics32创建剪裁掩码
EN

Stack Overflow用户
提问于 2012-01-22 20:48:18
回答 2查看 1.1K关注 0票数 2

我正在使用Graphics32进行图像处理。从它的功能来看,我觉得我还没有看到一个适当的剪辑掩码的实现。我确实看到“剪裁”这个词出现在这里和那里,但它似乎是指其他的东西。

简单地说,我需要一个层作为一个“窥视孔”到另一个;层A应该投射到B层,但只有当B层是可见的。(我认为没有必要再重新定义剪辑掩码是什么。)

如果只是我想显示的另一层的位图,那就不难做了--那么我可以使用这个诡计 --但更复杂的是,图层的位图并不能说明图层将显示什么;图层可以是:

  • (部分)看不见的(在视线之外)
  • 移动/拉伸+可选重放
  • 旋转

对它的位图没有影响。

这是否真的没有现成的实现呢?我自己有什么建议吗?

进展

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

代码语言:javascript
复制
type
  TLayerAccess = class(TBitmapLayer);

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

EN

回答 2

Stack Overflow用户

发布于 2012-01-23 15:53:13

看看TByteMap及其writeTo方法。

票数 0
EN

Stack Overflow用户

发布于 2013-03-12 09:45:01

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

您希望将一个TBitmapLayer连接到另一个,并将其视为它的掩码。但是,我想避免这些引用(以及它的潜在问题和Graphics32返工),并且认为这只是最后的手段。

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

若要在绘图到屏幕时正确地封闭(或省略) TBitmapLayer的部分,可以使用创建TPixelCombineEvent的方法并将其赋值为OnPixelCombine,并将TBitmapLayer.DrawMode设置为dmCustom

在该TPixelCombineEvent方法中,您可以确定给定背景B和给定当前M主α的前景F的像素结果。

代码语言:javascript
复制
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,可能是有趣的,也许性能的惩罚是可以忽略不计的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8964566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档