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

`

ссылка: https://github.com/bpolat/Alpha-Channel-Remover

Другие вопросы по тегам