如何将UIImage保存为透明PNG



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

我有一些具有透明背景的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]];
}

以及从应用程序文档返回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,这样一来,图像就没有失去任何功能。在那之后,当我在应用程序中使用它们作为正确的图像时,程序按预期工作。

您编写了

     [logoUserDef setValue:pngData forKey:@"logoImageData"];

但我看不出你在哪里同步。因此添加:

      [logoUserDef synchronize];

在使用后将图像保存到Documents目录时,我能够保持透明度

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    [self dismissViewControllerAnimated:YES completion:nil];
    UIImage *img = [info valueForKey:UIImagePickerControllerOriginalImage];
    [yourButton setImage:img forState:UIControlStateNormal];
    NSData *pngData = UIImagePNGRepresentation(img);
    //do something with pngData
}

关键是UIImagePickerControllerOriginalImage,而不是UIImagePickerControllerEditedImage等其他选项。

最新更新