Jak przekonwertować NSImage na NSBitmapImageRep? Mam kod: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;
}
Działa, ale powoduje wycieki pamięci. Przynajmniej kiedy używam go z ARC. Używanie initWithData:[nsimagename TIFFRepresentation]
nie działa poprawnie. Niektóre obrazy nie są dobre. Myślę, że to zależy od formatu i przestrzeni kolorów obrazu. Czy istnieją inne sposoby, aby to osiągnąć?
Wynik z mrwalker Sugerowane rozwiązanie:
Obraz oryginalny:
Budynek do bitmapimagerep i powrót do obrazu 1 raz:
Budynek do bitm apimagerep i Tylna 3 razy:
Jak widać obraz staje się ciemniejszy każdym razem po konwersji do NSBitmapImageRep
Hockeyman, czy nadal mają pełne rozwiązanie na swoje pytanie? Szukam sposobu identyfikacji pikseli kolorów bez zbytniego procesu. Może NSBitmapImageRep mógłby mi jakoś pomóc. Dzięki. – RickON