Wie konvertiert man NSImage in NSBitmapImageRep? Ich habe Code:NSImage to NSBitmapImageRep
- (NSBitmapImageRep *)bitmapImageRepresentation
{
NSBitmapImageRep *ret = (NSBitmapImageRep *)[self representations];
if(![ret isKindOfClass:[NSBitmapImageRep class]])
{
ret = nil;
for(NSBitmapImageRep *rep in [self representations])
if([rep isKindOfClass:[NSBitmapImageRep class]])
{
ret = rep;
break;
}
}
if(ret == nil)
{
NSSize size = [self size];
size_t width = size.width;
size_t height = size.height;
size_t bitsPerComp = 32;
size_t bytesPerPixel = (bitsPerComp/CHAR_BIT) * 4;
size_t bytesPerRow = bytesPerPixel * width;
size_t totalBytes = height * bytesPerRow;
NSMutableData *data = [NSMutableData dataWithBytesNoCopy:calloc(totalBytes, 1) length:totalBytes freeWhenDone:YES];
CGColorSpaceRef space = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRef ctx = CGBitmapContextCreate([data mutableBytes], width, height, bitsPerComp, bytesPerRow, CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB), kCGBitmapFloatComponents | kCGImageAlphaPremultipliedLast);
if(ctx != NULL)
{
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:[self isFlipped]]];
[self drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
[NSGraphicsContext restoreGraphicsState];
CGImageRef img = CGBitmapContextCreateImage(ctx);
ret = [[NSBitmapImageRep alloc] initWithCGImage:img];
[self addRepresentation:ret];
CFRelease(img);
CFRelease(space);
CGContextRelease(ctx);
}
}
return ret;
}
Es funktioniert, aber es verursacht Speicherverluste. Zumindest wenn ich es mit ARC benutze. Mit initWithData:[nsimagename TIFFRepresentation]
funktioniert es nicht richtig. Die Darstellungen einiger Bilder sind nicht gut. Ich denke, es hängt vom Format und vom Farbraum des Bildes ab. Gibt es andere Möglichkeiten, das zu erreichen?
Ergebnis mit MrWalker vorgeschlagene Lösung:
Originalbild:
Umgewandelt in Bild 1 mal bitmapimagerep und zurück:
Umgerechnet auf Bitm apimagerep und zurück zum Bild 3 mal:
Wie Sie Bild sehen dunkler nach zu NSBitmapImageRep Umwandlung jedes Mal bekommt
Hockeyman, haben Sie immer noch die volle Lösung auf Ihre Frage? Ich suche nach einer Möglichkeit, Pixelfarben ohne zu viel Prozess zu identifizieren. Vielleicht könnte NSBitmapImageRep mir irgendwie helfen. Vielen Dank. – RickON