2014-01-16 7 views
0

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

how to give UIImage negative color effect

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

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

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); 

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

Edit: Прочитав документацию для UIGraphicsBeginImageContextWithOptions он говорит:

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

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

ответ

2

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

- (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; 
} 

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