Преобразование 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. Кто-нибудь еще сталкивался с этим?

ОТРЕДАКТИРОВАНО, ЧТОБЫ ПОКАЗАТЬ ПРОМЫВЫЕ РЕЗУЛЬТАТЫ:

ОБНОВЛЕННЫЙ КОД (это то, что в настоящее время дает размытые результаты)


person joeByDesign    schedule 23.01.2013    source источник


Ответы (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);
 }
person Rachel Gallen    schedule 23.01.2013
comment
Пожалуйста, простите мое невежество, но у меня не получается. Это чистый Си? - person joeByDesign; 23.01.2013
comment
см. эту ссылку для кода lists.apple.com/archives/cocoa -dev/2009/февраль/msg00985.html - person Rachel Gallen; 23.01.2013
comment
После некоторой переделки он работает, так что спасибо за это. Однако изображения выглядят очень размытыми. Какие-либо предложения? - person joeByDesign; 24.01.2013
comment
вы можете увеличить биты на пиксель и биты на выборку и т. д., и это выглядит нормально - person Rachel Gallen; 24.01.2013
comment
Как только я изменяю какие-либо параметры RGBImageRep, на каждом изображении происходит сбой с: CGContextSetBlendMode: недопустимый контекст 0x0 - person joeByDesign; 24.01.2013
comment
см. coffeeshopped.com/2010/09/ интересные советы о том, как раскрасить изображение - может сработать. Вы можете попробовать это после преобразования. - person Rachel Gallen; 24.01.2013
comment
Спасибо за вашу помощь @Rachel Gallen. Я думаю, что мои нынешние результаты так хороши, как они собираются получить. - person joeByDesign; 24.01.2013
comment
без проблем, всегда рад помочь. жаль, что результаты не лучше! - person Rachel Gallen; 24.01.2013