Запазване на 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 с тези параметри директно? Всяка помощ с кодов фрагмент ще бъде високо оценена.

наздраве

Дейв


person Magic Bullet Dave    schedule 20.02.2014    source източник


Отговори (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);
person Magic Bullet Dave    schedule 21.02.2014