UIImageWriteToSavedPhotosAlbum сохранить как PNG с прозрачностью?

Я использую UIImageWriteToSavedPhotosAlbum для сохранения UIImage в фотоальбом пользователя. Проблема в том, что изображение не имеет прозрачности и является JPG. Я правильно настроил пиксельные данные, чтобы иметь прозрачность, но, похоже, нет способа сохранить в формате, поддерживающем прозрачность. Идеи?

РЕДАКТИРОВАТЬ: Невозможно выполнить это, однако есть другие способы доставки изображений PNG пользователю. Одним из них является сохранение изображения в каталоге "Документы" (как описано ниже). Как только вы это сделаете, вы можете отправить его по электронной почте, сохранить в базе данных и т.д. Вы просто не можете попасть в фотоальбом (пока), если это не потерянный непрозрачный JPG.

Ответ 1

Это проблема, о которой я уже говорил, и сообщил о форумах разработчиков Apple около года назад. Насколько я знаю, это все еще открытый вопрос.

Если у вас есть момент, пожалуйста, найдите время, чтобы подать запрос функции в Отчет об ошибке Apple. Если больше людей сообщают об этой проблеме, более вероятно, что Apple исправит этот метод для вывода без потерь, альфа-совместимого PNG.

ИЗМЕНИТЬ

Если вы можете составить свое изображение в памяти, я думаю, что что-то вроде следующего будет работать или, по крайней мере, начать:

- (UIImage *) composeImageWithWidth:(NSInteger)_width andHeight:(NSInteger)_height {
    CGSize _size = CGSizeMake(_width, _height);
    UIGraphicsBeginImageContext(_size);

    // Draw image with Quartz 2D routines over here...

    UIImage *_compositeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return _compositeImage;
}

//
// cf. https://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/FilesandNetworking/FilesandNetworking.html#//apple_ref/doc/uid/TP40007072-CH21-SW20
//

- (BOOL) writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    if (!documentsDirectory) {
        NSLog(@"Documents directory not found!");
        return NO;
    }
    NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];
    return ([data writeToFile:appFile atomically:YES]);
}

// ...

NSString *_imageName = @"myImageName.png";
NSData *_imageData = [NSData dataWithData:UIImagePNGRepresentation([self composeImageWithWidth:100 andHeight:100)];

if (![self writeApplicationData:_imageData toFile:_imageName]) {
    NSLog(@"Save failed!");
}

Ответ 2

Как указано в этом SO вопрос, есть простой способ сохранить png в ваших фотоальбомах:

UIImage* image = ...;                                     // produce your image
NSData* imageData =  UIImagePNGRepresentation(image);     // get png representation
UIImage* pngImage = [UIImage imageWithData:imageData];    // rewrap
UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);  // save to photo album

Ответ 3

В Swift 5:

func pngFrom(image: UIImage) -> UIImage {
    let imageData = image.pngData()!
    let imagePng = UIImage(data: imageData)!
    return imagePng
}