Comment faire pour convertir NSImage en NSBitmapImageRep? J'ai le 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;
}
Cela fonctionne, mais il provoque des fuites de mémoire. Au moins quand je l'utilise avec ARC. En utilisant initWithData:[nsimagename TIFFRepresentation]
cela ne fonctionne pas correctement. Les représentations de certaines images ne sont pas bonnes. Je pense que cela dépend du format et de l'espace de couleurs de l'image. Y a-t-il d'autres moyens d'y parvenir?
Résultat avec MrWalker solution suggérée:
Image originale:
converti à bitmapimagerep et retour à l'image 1 fois:
converti à bitm apimagerep et retour à l'image 3 fois:
Comme vous le voyez l'image devient plus sombre chaque fois après la conversion en NSBitmapImageRep
Hockeyman, avez-vous toujours la solution complète à votre question? Je cherche un moyen d'identifier les couleurs des pixels sans trop de processus. Peut-être que NSBitmapImageRep pourrait m'aider d'une manière ou d'une autre. Merci. – RickON