Конвертировать NSImage из CMYK в RGB
После целого дня поисков я нашел несколько похожих ответов, но ничего, что мне не подходит.
Я создал приложение для использования в OSX, которое извлекает список изображений из введенного пользователем каталога, запускает каждое из них через процесс переименования, преобразует в JPG и, надеюсь, с вашей помощью преобразует в цвет RGB.
NSImage *image = [[NSImage alloc] initWithContentsOfFile:from];
NSInteger imageWidth = image.size.width * 4.16666666667;
NSInteger imageHeight = image.size.height * 4.16666666667;
NSBitmapImageRep* theRGBImageRep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL pixelsWide:imageWidth pixelsHigh:imageHeight
bitsPerSample: 8 samplesPerPixel: 4 hasAlpha: YES isPlanar: NO
colorSpaceName: NSCalibratedRGBColorSpace bytesPerRow: 0 bitsPerPixel: 0];
NSGraphicsContext* theContext = [NSGraphicsContext
graphicsContextWithBitmapImageRep: theRGBImageRep];
NSImageRep* theImageRep = [image bestRepresentationForRect:
NSMakeRect(0.0, 0.0, imageWidth, imageHeight) context:theContext
hints:[NSDictionary dictionaryWithObject:NSDeviceRGBColorSpace
forKey:NSDeviceColorSpaceName]];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: theContext];
NSRect theBoundsRect = NSMakeRect(0.0, 0.0, [theRGBImageRep pixelsWide],
[theRGBImageRep pixelsHigh]);
[[NSColor clearColor] set];
NSRectFill(theBoundsRect);
[theImageRep drawInRect: theBoundsRect];
[NSGraphicsContext restoreGraphicsState];;
[image addRepresentation: theRGBImageRep];
NSDictionary *imageProps = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat:1.0],NSImageCompressionFactor, nil];
NSData *bitmapData = [theRGBImageRep representationUsingType:NSJPEGFileType
properties:imageProps];
if ([bitmapData writeToFile:toJPG atomically:YES] == YES){
feedback = [NSString stringWithFormat:@"%@ -> %@\n", string, jpgFileName];
[readOut insertText:feedback];
[readOut display];
} else {
feedback = [NSString stringWithFormat:@"%@ - FAILED\n", string];
[errorLog insertText:feedback];
[errorLog display];
}
Если изображение правильно выводится в формате JPEG, в назначенную папку, но всегда остается CMYK. Кто-нибудь еще сталкивался с этим?
ИЗМЕНЕНО, ЧТОБЫ ПОКАЗАТЬ ВЫмытые РЕЗУЛЬТАТЫ
ОБНОВЛЕННЫЙ КОД (это то, что в настоящее время дает размытые результаты)
1 ответ
Решение
Попробуй это
NSImageRep* theImageRep = [inputImage bestRepresentationForDevice:
[NSDictionary dictionaryWithObject: NSDeviceRGBColorSpace
forKey: NSDeviceColorSpaceName]];
NSString* theColorSpace = [theImageRep colorSpaceName];
if ([theColorSpace isEqualToString: NSDeviceCMYKColorSpace])
{
NSBitmapImageRep* theRGBImageRep = [[[NSBitmapImageRep alloc]
initWithBitmapDataPlanes: NULL
pixelsWide: [theImageRep pixelsWide]
pixelsHigh: [theImageRep pixelsHigh]
bitsPerSample: 8
samplesPerPixel: 4
hasAlpha: YES
isPlanar: NO
colorSpaceName: NSDeviceRGBColorSpace
bytesPerRow: 0
bitsPerPixel: 0] autorelease];
NSGraphicsContext* theContext = [NSGraphicsContext
graphicsContextWithBitmapImageRep: theRGBImageRep];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext: theContext];
NSRect theBoundsRect = NSMakeRect(0.0, 0.0, [theRGBImageRep pixelsWide],
[theRGBImageRep pixelsHigh]);
[[NSColor clearColor] set];
NSRectFill(theBoundsRect);
[theImageRep drawInRect: theBoundsRect];
[NSGraphicsContext restoreGraphicsState];
ASSIGNOBJECT(rgbImage, [[[NSImage alloc] initWithSize: [theImageRepsize]] autorelease]);
[rgbImage addRepresentation: theRGBImageRep];
}
else
{
ASSIGNOBJECT(rgbImage, inputImage);
}