Как получить отрицательные цвета UIImage без изменения цветового пространства

Итак, я последовал совету в этом вопросе:

как создать отрицательный цветовой эффект UIImage

но когда я делаю преобразование, информация о цветовом пространстве теряется и возвращается к RGB. (хочу в сером цвете).

Если я NSLog CGColorSpaceRef до и после данного кода, это подтверждает это.

CGColorSpaceRef before = CGImageGetColorSpace([imageView.image CGImage]);
NSLog(@"%@", before);

UIGraphicsBeginImageContextWithOptions(imageView.image.size, YES, imageView.image.scale);

CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);

[imageView.image drawInRect:CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height)];

CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDifference);

CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor whiteColor].CGColor);

CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height));

imageView.image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

CGColorSpaceRef after = CGImageGetColorSpace([imageView.image CGImage]);
NSLog(@"%@", after);

Есть ли способ сохранить информацию о цветовом пространстве, или, если нет, как я могу вернуть ее обратно после этого?

Редактировать: при чтении документации для UIGraphicsBeginImageContextWithOptions говорится:

Для растровых изображений, созданных в iOS 3.2 и более поздних версиях, среда рисования использует предварительно умноженный формат ARGB для хранения данных растрового изображения. Если для параметра opaque установлено значение YES, растровое изображение считается полностью непрозрачным, а его альфа-канал игнорируется.

Так что, может быть, это невозможно без замены на CGContext? Я обнаружил, что если я устанавливаю для параметра opaque значение YES, то он удаляет альфа-канал, что является адекватным (используемая мной программа для чтения tiff не может обрабатывать изображения ARGB). Я все же хотел бы иметь только изображение в градациях серого, чтобы уменьшить размер файла.


person CHiroshiWard    schedule 16.01.2014    source источник


Ответы (1)


Единственный способ, который я нашел для решения этой проблемы, - добавить еще один метод для повторного преобразования изображения в оттенки серого после того, как я его инвертировал. Я добавил этот метод:

- (UIImage *)convertImageToGrayScale:(UIImage *)image
{
// Create image rectangle with current image width/height
CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);

// Grayscale color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

// Create bitmap content with current image size and grayscale colorspace
CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone);

// Draw image into current context, with specified rectangle
// using previously defined context (with grayscale colorspace)
CGContextDrawImage(context, imageRect, [image CGImage]);

// Create bitmap image info from pixel data in current context
CGImageRef imageRef = CGBitmapContextCreateImage(context);

// Create a new UIImage object
UIImage *newImage = [UIImage imageWithCGImage:imageRef];

// Release colorspace, context and bitmap information
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
CFRelease(imageRef);

// Return the new grayscale image
return newImage;
}

Если у кого-то есть более аккуратные методы, я был бы рад их услышать!

person CHiroshiWard    schedule 03.03.2014