2014-02-20 3 views
0

У меня есть NSImage, который я хотел бы сохранить как PNG, но удалить альфа-канал и использовать 5-битный цвет. Сейчас я делаю это, чтобы создать свой PNG:Сохранение NSImage как PNG без альфа-и 5-битного цвета

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 с этими параметрами напрямую? Любая помощь, с фрагментом кода, будет с благодарностью оценена.

Приветствия

Dave

ответ

0

Я сделал это в конце концов. Выглядит уродливо и пахнет мне. Любые лучшие предложения очень ценятся.

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