Сохранение NSImage в формате PNG без альфа и 5-битного цвета
У меня есть NSImage, который я хотел бы сохранить как PNG, но удалить альфа-канал и использовать 5-битный цвет. В настоящее время я делаю это, чтобы создать свой PNG:
NSData *imageData = [image TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = nil;
imageData = [imageRep representationUsingType:NSPNGFileType properties:imageProps];
[imageData writeToFile:fileNameWithExtension atomically:YES];
Я читал много похожих вопросов по SO, но я не совсем понимаю, какой подход лучше / правильный. Создать новый контекст CGGraphics и привлечь к нему? Могу ли я создать новый imageRep с этими параметрами напрямую? Любая помощь с фрагментом кода будет принята с благодарностью.
ура
Дейв
1 ответ
Решение
Я сделал это в конце. Выглядит некрасиво и пахнет для меня. Любые лучшие предложения с благодарностью.
// Create a graphics context (5 bits per colour, no-alpha) to render the tile
static int const kNumberOfBitsPerColour = 5;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef tileGraphicsContext = CGBitmapContextCreate (NULL, rect.size.width, rect.size.height, kNumberOfBitsPerColour, 2 * rect.size.width, colorSpace, kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst);
// Draw the clipped part of the image into the tile graphics context
NSData *imageData = [clippedNSImage TIFFRepresentation];
CGImageRef imageRef = [[NSBitmapImageRep imageRepWithData:imageData] CGImage];
CGContextDrawImage(tileGraphicsContext, rect, imageRef);
// Create an NSImage from the tile graphics context
CGImageRef newImage = CGBitmapContextCreateImage(tileGraphicsContext);
NSImage *newNSImage = [[NSImage alloc] initWithCGImage:newImage size:rect.size];
// Clean up
CGImageRelease(newImage);
CGContextRelease(tileGraphicsContext);
CGColorSpaceRelease(colorSpace);