4 Stimmen

Zeichnen auf NSBitmapImageRep

Ich versuche, ein Bild im Speicher zu erstellen, darauf zu zeichnen und auf der Festplatte zu speichern.

Aktueller Code:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes:NULL
                         pixelsWide:256
                         pixelsHigh:256
                         bitsPerSample:8
                         samplesPerPixel:4
                         hasAlpha:YES
                         isPlanar:YES
                         colorSpaceName:NSDeviceRGBColorSpace
                         bitmapFormat:NSAlphaFirstBitmapFormat
                         bytesPerRow:0
                         bitsPerPixel:8
                         ];

[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:rep]];

// Draw your content...
NSRect aRect=NSMakeRect(10.0,10.0,30.0,30.0);
NSBezierPath *thePath=[NSBezierPath bezierPathWithRect:aRect];
[[NSColor redColor] set];
[thePath fill];

[NSGraphicsContext restoreGraphicsState];

NSData *data = [rep representationUsingType: NSPNGFileType properties: nil];
[data writeToFile: @"test.png" atomically: NO];

beim Versuch, im aktuellen Kontext zu zeichnen, erhalte ich einen Fehler

CGContextSetFillColorWithColor: ungültiger Kontext 0x0

Was ist hier falsch? Warum ist der Kontext, der von NSBitmapImageRep zurückgegeben wird, NULL? Was ist der beste Weg, um ein gezeichnetes Bild zu erstellen und zu speichern?

UPDATE:

Schließlich kam ich zu folgender Lösung:

NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(256, 256)];
[image lockFocus];

NSRect aRect=NSMakeRect(10.0,10.0,30.0,30.0);
NSBezierPath *thePath=[NSBezierPath bezierPathWithRect:aRect];
[[NSColor redColor] set];
[thePath fill];

[image unlockFocus];

NSData *data = [image TIFFRepresentation];
[data writeToFile: @"test.png" atomically: NO];

6voto

Mete Punkte 5207

Ihr Workaround ist für die Aufgabe gültig, jedoch handelt es sich um eine teurere Operation als die tatsächliche Verwendung eines NSBitmapImageRep! Siehe http://cocoadev.com/wiki/NSBitmapImageRep für eine Diskussion.

Beachten Sie, dass die Dokumentation für [NSGraphicsContext graphicsContextWithBitmapImageRep:] besagt:

"Diese Methode akzeptiert nur NSBitmapImageRep-Instanzen mit einzelner Ebene."

Sie richten Ihren NSBitmapImageRep mit isPlanar:YES ein, was daher mehrere Ebenen verwendet... Setzen Sie es auf NO - dann sollten Sie bereit sein!

Mit anderen Worten:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                     initWithBitmapDataPlanes:NULL
                     pixelsWide:256
                     pixelsHigh:256
                     bitsPerSample:8
                     samplesPerPixel:4
                     hasAlpha:YES
                     isPlanar:NO
                     colorSpaceName:NSDeviceRGBColorSpace
                     bitmapFormat:NSAlphaFirstBitmapFormat
                     bytesPerRow:0
                     bitsPerPixel:0
                     ];
// usw...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X