UIImageWriteToSavedPhotosAlbum保存为PNG透明度?

Eli*_*Eli 11 iphone quartz-graphics uiimage

我正在使用UIImageWriteToSavedPhotosAlbum将UIImage保存到用户的相册中.问题是图像没有透明度并且是JPG.我已正确设置像素数据以保持透明度,但似乎没有办法以透明度支持的格式进行保存.想法?

编辑:没有办法实现这一点,但是还有其他方法可以向用户提供PNG图像.其中之一是将图像保存在Documents目录中(如下所述).完成后,您可以通过电子邮件发送,将其保存在数据库中等等.除非它是一个有损的非透明JPG,否则您无法将其放入相册(现在).

IlD*_*Dan 38

正如上指出了这个 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
Run Code Online (Sandbox Code Playgroud)


Ale*_*lds 13

这是我之前注意到的问题,大约一年前在Apple开发者论坛上报道过.据我所知,它仍然是一个悬而未决的问题.

如果您有时间,请花时间在Apple Bug Report上提交功能请求.如果有更多人报告此问题,Apple更有可能会修复此方法以输出无损,支持alpha的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!");
}
Run Code Online (Sandbox Code Playgroud)


小智 6

在 Swift 5 中:

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


Dan*_*182 6

我创建了一个带有安全展开功能的 UIImage 扩展:

扩大

extension UIImage {
    func toPNG() -> UIImage? {
        guard let imageData = self.pngData() else {return nil}
        guard let imagePng = UIImage(data: imageData) else {return nil}
        return imagePng
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

let image = //your UIImage
if let pngImage = image.toPNG() {
     UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil)
}
Run Code Online (Sandbox Code Playgroud)