Как получить 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). Я все еще хотел бы иметь только изображение в градациях серого, чтобы уменьшить размер файла.
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;
}
Если у кого-нибудь есть более аккуратные методы, я буду рад их услышать!