OS X - Как сохранить NSImage или NSBitmapImageRep в файл PNG без альфа-канала?
Я создаю приложение для OS X, которое должно сохранить файл на диск.
Я сейчас пользуюсь NSBitmapImageRep
представлять изображение в моем коде, и при сохранении изображения на диск с representationUsingType:properties:
метод, я хочу установить hasAlpha
канал для изображения, но properties
словарь, кажется, не поддерживает это.
Итак, я попытался создать растровое представление без альфа, но по многим вопросам SO комбинация 3 канала /24 бита не поддерживается. Ну что мне тогда делать?
Большое спасибо!
2 ответа
Прежде всего, я бы попробовал просто убедиться, что вы создаете свой NSBitmapImageRep с
-initWithBitmapDataPlanes:... hasAlpha:NO ...
И запишите это и посмотрите, не будет ли у результата альфа - можно надеяться.
Если вы пытаетесь записать изображение, в котором есть альфа, но не пишете альфа, просто сначала скопируйте его в не альфа изображение и запишите его.
`
NSURL *url = [NSURL fileURLWithPath:name];
CGImageSourceRef source;
NSImage *srcImage =[[NSImage alloc] initWithContentsOfURL:url];;
NSLog(@"URL: %@",url);
source = CGImageSourceCreateWithData((__bridge CFDataRef)[srcImage TIFFRepresentation], NULL);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
CGRect rect = CGRectMake(0.f, 0.f, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef));
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
rect.size.width,
rect.size.height,
CGImageGetBitsPerComponent(imageRef),
CGImageGetBytesPerRow(imageRef),
CGImageGetColorSpace(imageRef),
kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Little
);
CGContextDrawImage(bitmapContext, rect, imageRef);
CGImageRef decompressedImageRef = CGBitmapContextCreateImage(bitmapContext);
NSImage *finalImage = [[NSImage alloc] initWithCGImage:decompressedImageRef size:NSZeroSize];
NSData *imageData = [finalImage TIFFRepresentation];
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
NSDictionary *imageProps = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:0.9] forKey:NSImageCompressionFactor];
imageData = [imageRep representationUsingType:NSPNGFileType properties:imageProps];
[imageData writeToFile:name atomically:NO];
CGImageRelease(decompressedImageRef);
CGContextRelease(bitmapContext);
`