1

これは、1 ピクセルあたり 32 ビットの一時ビットマップを malloc してから、for ループでアルファ コンポーネントをクリアし、最後に再び 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];

注: アルファ チャネルを 1 に設定するには、NSCompositePlusLighter で blackColor を使用します。

アルファチャンネルクリアの秘密とは?

4

2 に答える 2

4

高速ではありませんが、これも同様に機能します。

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];
于 2009-10-14T00:26:05.483 に答える
2
  1. イメージの可変性に関する AppKit リリース ノートをお読みください。NSImage は基本的に不変として扱われるべきです。

  2. グラフィックス コンテキストでサポートされているすべてのピクセル形式には、あらかじめ乗算された alphaがあります。アルファ チャネルがゼロの場合、他のチャネルもゼロにする必要があります。

于 2009-10-13T22:42:19.310 に答える