清除 NSImage 的 Alpha 通道

发布于 2024-08-07 14:25:51 字数 742 浏览 10 评论 0 原文

可以通过分配一个每像素 32 位的临时位图来完成 然后用 for 循环清除 alpha 分量 最后再次将其转回 NSImage。

我怀疑可以使用聪明的方法以更简单的方式完成 NSColor 和 NSCompositingOperation。或者也许是图像 需要使用drawAtPoint与其自身合成。

我的代码看起来像这样。

NSImage* img = some image with RGB and Alpha;
NSRect rect  = some rect inside the image;
[img lockFocus];
[[NSColor clearColor] set];
NSRectFillUsingOperation(rect, NSCompositeXOR);
[img unlockFocus];

注意:将 alpha 通道设置为 1 可以通过以下方式完成 使用带有 NSCompositePlusLighter 的 blackColor。

清除阿尔法通道的秘诀是什么?

It can be done by mallocing a temporary bitmap with 32bits per pixel
and then clearing the alpha component with a for loop and
and finally turn it back into a NSImage again.

I suspect is can be done in a simpler way using a clever
combination of NSColor and NSCompositingOperation. Or perhaps the image
needs to be composited with itself using drawAtPoint.

My code looks like this.

NSImage* img = some image with RGB and Alpha;
NSRect rect  = some rect inside the image;
[img lockFocus];
[[NSColor clearColor] set];
NSRectFillUsingOperation(rect, NSCompositeXOR);
[img unlockFocus];

NOTE: Setting the alpha channel to 1 can be done by
using a blackColor with NSCompositePlusLighter.

What is the secret in clearing the alpha channel?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陪你搞怪i 2024-08-14 14:25:51

它不会很快,但也可以:

NSImage *newImage = [[NSImage alloc] initWithSize:[srcImage size]];
[newImage lockFocus];
[[NSColor whiteColor] set];
NSRectFill(NSMakeRect(0,0,[newImage size].width, [newImage size].height));
[srcImage compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
[newImage unlockFocus];

It won't be fast but this will work as well:

NSImage *newImage = [[NSImage alloc] initWithSize:[srcImage size]];
[newImage lockFocus];
[[NSColor whiteColor] set];
NSRectFill(NSMakeRect(0,0,[newImage size].width, [newImage size].height));
[srcImage compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
[newImage unlockFocus];
我还不会笑 2024-08-14 14:25:51
  1. 请阅读有关图像可变性主题的 AppKit 发行说明。 NSImage 基本上应该被视为不可变的。

  2. 所有图形上下文中支持的像素格式具有预乘 alpha。如果 Alpha 通道为零,则其他通道也必须为零。

  1. Please read the AppKit release notes on the subject of image mutability. NSImage should basically be treated as immutable.

  2. All of the pixel formats supported in graphics contexts have premultiplied alpha. If the alpha channel is zero, the other channels have to be zero too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文