-1

我正在构建一个需要将文件保存到磁盘的 OS X 应用程序。

我目前正在使用NSBitmapImageRep在我的代码中表示图像,并且在使用方法将图像保存到磁盘时representationUsingType:properties:,我想hasAlpha为图像设置通道,但properties字典似乎不支持这一点。
因此,我尝试创建一个无 alpha位图表示,但根据许多 SO 问题,不支持 3 通道/24 位组合。那么,那我该怎么办呢?

非常感谢!

4

2 回答 2

1

首先,我会尝试确保您创建 NSBitmapImageRep

-initWithBitmapDataPlanes:... hasAlpha:NO ...

把它写出来,看看结果是否没有 alpha——希望如此。

如果您尝试写出具有 alpha 的图像,但不写 alpha,只需先将其复制到非 alpha 图像中,然后将其写出来。

于 2014-01-25T11:04:41.233 回答
0

`

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

`

参考: https ://github.com/bpolat/Alpha-Channel-Remover

于 2018-03-31T11:35:46.977 回答