ios - 如何将 UIImage 保存为透明 PNG?

标签 ios objective-c uiimage png transparent

我不确定我在哪里做错了,这就是为什么我想在这里粘贴一些代码块以找出问题所在。

我有一些具有透明背景的 PNG 图像,使用下面的代码块我尝试将所选图像保存到应用程序文件夹和 NSUserDefault。然后我试图从应用程序文件夹中调用保存的图像并显示在 UIBarButtonItem 上。

保存到 NSUserDefault 的目的也是为了测试。

所以,

这就是我选择图像的方式。

- (IBAction)btnPressed:(UIButton *)sender
{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    {
        UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init];
        imgPicker.delegate = self;
        imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imgPicker.mediaTypes = [NSArray arrayWithObject:(NSString *)kUTTypeImage];
        imgPicker.allowsEditing = NO;

        [self presentViewController:imgPicker animated:YES completion:nil];
    }

}

然后我使用 didFinishPickingMediaWithInfo 将它保存到应用程序中;

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    [self dismissViewControllerAnimated:YES completion:nil];

    if ([mediaType isEqualToString:(NSString *) kUTTypeImage])
    {
        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

        //I believe this has the problem.
        NSData *pngData = UIImagePNGRepresentation(image);

        NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"AppImages"];;

        NSError *error = nil;

        if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:&error];

        NSString *fileName = [stringPath stringByAppendingPathComponent:@"logoImage.png"];
        [pngData writeToFile:fileName atomically:YES];
        NSUserDefaults *logoUserDef = [NSUserDefaults standardUserDefaults];
        [logoUserDef setValue:pngData forKey:@"logoImageData"];
    }
}

注意:我对没有透明背景的图像没有问题。

最后,这就是我从 Application 和 NSUserDefault 调用它的方式。

同时使用 NSUserDefaults 和 AppDirectory 查看它们是否显示不同的结果。

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"logoImageData"])
{
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; 
    UIImage *testing = [UIImage imageWithData:[user valueForKey:@"logoImageData"]];

    NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    UIImage * image = [self loadImageWithFileName:@"logoImage" ofType:@"png" inDirectory:documentsDirectory];

    UIBarButtonItem *logoBarButton = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(logoTapped)];
    logoBarButton.imageInsets = UIEdgeInsetsMake(9, 0, 9, 90);
    logoBarButton.image = [logoBarButton.image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    [self.navigationItem setLeftBarButtonItems:@[logoBarButton]];
}

以及从 App Document 返回 UIImage 的方法。

-(UIImage *)loadImageWithFileName:(NSString *)fileName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath {
    UIImage * result = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@/%@.%@",   directoryPath, @"AppImages", fileName, [extension lowercaseString]]];

    return result;
}

我不知道我哪里做错了,但一如既往,当我选择具有透明背景的图像时。它总是将其背景转换为白色。我需要保存它,因为它是透明的。我进行了很多搜索,但找不到解决此问题的方法。

感谢任何帮助。

最佳答案

问题解决了!

我随问题发布的代码块没有任何问题。问题是从 iTunes 发生的,当我将我的 Mac 上的图像同步到我的 iPhone 时,iTunes 将它们转换为 JPEG 并且由于这些图像失去了透明度等......当我使用我的应用程序选择图像时,我将它们选择为 JPEG 而没有意识到这一点,这就是我遇到这些问题的原因。

所以我想出了一个通过电子邮件获取图像的解决方案。我只是通过电子邮件将它们从我的 Mac 发送到 iPhone,并且通过这些图像并没有丢失任何功能。之后,当我在应用程序中将它们用作正确的图像时,该程序按预期运行。

关于ios - 如何将 UIImage 保存为透明 PNG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28545424/

相关文章:

ios - 添加新 child 时出现 dispatch_group_leave 错误

ios - swift NSDate AM 和 Pm 格式

ios - 带有内核的 OpenCV Filter2D iPhone

iphone - 如何在 Objective C 中执行动画

iphone - iOS:NSUrl 语法

ios - 将更多数据附加到公共(public)类中定义的 api

objective-c - 更新 MKMapView (iPhone) 的中心点和缩放

uiimage - 将 CMSampleBufferRef 转换为 UIImage

ios - 在不关闭 UIImagePickerController 的情况下捕获 UIImage?

iphone - 关于使用沙箱与缓存进行 UITableView 异步图像下载的建议