標準反転NSImageでは(代わりに黒の白)を描きます
-
22-09-2019 - |
質問
私は白の代わりに黒で標準NSImageではを描画しようとしています。現在NSGraphicsContextに黒で画像を描画するため、次の作品の罰金ます:
NSImage* image = [NSImage imageNamed:NSImageNameEnterFullScreenTemplate];
[image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
私はNSCompositeXORは、トリックを行うと予想、ありません。パス:私は複雑[「CIColorInvert」@ CIFilter filterWithName]をダウンする必要がありますか?私は何かを簡単に不足しているしなければならないような気がします。
アンダース
解決
コアイメージルートは、最も信頼性の高いだろう。それは私が下記のサンプルを掲載しました、実際には非常に複雑ではありません。あなたがあなたのイメージのどれもが反転しないことがわかっているならば、あなたは、変換コードを削除することができます。注意する主なものは、あなたが可能な場合はNSImage
をキャッシュし、各描画操作中にそれを再作成していないことを確認する必要がありますのでCIImage
からCIImage
への変換は、高価な性能面にできることである。
CIImage* ciImage = [[CIImage alloc] initWithData:[yourImage TIFFRepresentation]];
if ([yourImage isFlipped])
{
CGRect cgRect = [ciImage extent];
CGAffineTransform transform;
transform = CGAffineTransformMakeTranslation(0.0,cgRect.size.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
ciImage = [ciImage imageByApplyingTransform:transform];
}
CIFilter* filter = [CIFilter filterWithName:@"CIColorInvert"];
[filter setDefaults];
[filter setValue:ciImage forKey:@"inputImage"];
CIImage* output = [filter valueForKey:@"outputImage"];
[output drawAtPoint:NSZeroPoint fromRect:NSRectFromCGRect([output extent]) operation:NSCompositeSourceOver fraction:1.0];
注:解放/保持するメモリ管理は、上記のコードは、ガベージコレクションを想定し、運動として残っている
。あなたが任意のサイズの画像をレンダリングする場合は、次のことを行うことができます:
NSSize imageSize = NSMakeSize(1024,768); //or whatever size you want
[yourImage setSize:imageSize];
[yourImage lockFocus];
NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
[yourImage unlockFocus];
CIImage* image = [CIImage imageWithData:[bitmap TIFFRepresentation]];
他のヒント
ちょうど1つのノート:私はCIColorInvertフィルタは、常に信頼できるものではないことがわかりました。 Photoshopで倒立像をバック反転する場合たとえば、CIFilterははるかに軽い画像を生成します。私の知る限り理解されるように、それが原因で他のソースから来CIFilter(ガンマ1)及び画像のガンマ値の差から発生します。
私はCIFilterのガンマ値を変更する方法を模索していましたが、、私はバグがCIContextにありますので注意が見つかりました:デフォルトの1からのガンマ値を変更すると、予期しない結果を生成します。
。にかかわらず、常に正しい結果を生成反転NSImageでは、に別の解決策があります - 。NSBitmapImageRepのピクセルを反転することによっては、
私は( http://bit.ly/Y6GpLnする)etutorials.orgからコードを再投稿しています:
// srcImageRep is the NSBitmapImageRep of the source image
int n = [srcImageRep bitsPerPixel] / 8; // Bytes per pixel
int w = [srcImageRep pixelsWide];
int h = [srcImageRep pixelsHigh];
int rowBytes = [srcImageRep bytesPerRow];
int i;
NSImage *destImage = [[NSImage alloc] initWithSize:NSMakeSize(w, h)];
NSBitmapImageRep *destImageRep = [[[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:w
pixelsHigh:h
bitsPerSample:8
samplesPerPixel:n
hasAlpha:[srcImageRep hasAlpha]
isPlanar:NO
colorSpaceName:[srcImageRep colorSpaceName]
bytesPerRow:rowBytes
bitsPerPixel:NULL] autorelease];
unsigned char *srcData = [srcImageRep bitmapData];
unsigned char *destData = [destImageRep bitmapData];
for ( i = 0; i < rowBytes * h; i++ )
*(destData + i) = 255 - *(srcData + i);
[destImage addRepresentation:destImageRep];