我正在构建一个需要将文件保存到磁盘的 OS X 应用程序。
我目前正在使用NSBitmapImageRep
在我的代码中表示图像,并且在使用方法将图像保存到磁盘时representationUsingType:properties:
,我想hasAlpha
为图像设置通道,但properties
字典似乎不支持这一点。
因此,我尝试创建一个无 alpha位图表示,但根据许多 SO 问题,不支持 3 通道/24 位组合。那么,那我该怎么办呢?
非常感谢!
我正在构建一个需要将文件保存到磁盘的 OS X 应用程序。
我目前正在使用NSBitmapImageRep
在我的代码中表示图像,并且在使用方法将图像保存到磁盘时representationUsingType:properties:
,我想hasAlpha
为图像设置通道,但properties
字典似乎不支持这一点。
因此,我尝试创建一个无 alpha位图表示,但根据许多 SO 问题,不支持 3 通道/24 位组合。那么,那我该怎么办呢?
非常感谢!
首先,我会尝试确保您创建 NSBitmapImageRep
-initWithBitmapDataPlanes:... hasAlpha:NO ...
把它写出来,看看结果是否没有 alpha——希望如此。
如果您尝试写出具有 alpha 的图像,但不写 alpha,只需先将其复制到非 alpha 图像中,然后将其写出来。
`
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);
`