【问题标题】:Using UIImagePickerController to get image -- how to know whether to save PNG or JPEG?使用 UIImagePickerController 获取图像——如何知道是保存 PNG 还是 JPEG?
【发布时间】:2012-07-01 11:45:16
【问题描述】:

我有一个UIImagePickerController 让用户从图片库中挑选一张图片,并通过didFinishPickingMediaWithInfo 方法获得结果。

我需要能够将生成的图像保存到磁盘(在应用程序的文档文件夹中),然后再重新加载。

问题是我不知道是将其存储为 PNG 还是 JPEG。我不能总是将它存储为 PNG,因为对于较大的照片,它非常慢(更不用说我必须单独处理存储图像方向)。我不能总是将其存储为 JPEG,因为在某些情况下,图像具有透明度,如果这样做会丢失。

我检查了图像选择器返回的信息字典中的UIImagePickerControllerMediaType 键,无论我选择的是PNG 还是JPEG,返回的是"image.public"

所以...

有什么方法可以知道用户是否选择了 PNG?也许一些方法只是检查图像是否有任何透明度或其他东西?

谢谢。

【问题讨论】:

    标签: objective-c ios uiimage uiimagepickercontroller


    【解决方案1】:

    在字典中,键 UIImagePickerControllerReferenceURL 将为您提供有关类型的信息

    (gdb) po 信息

    {
        UIImagePickerControllerMediaType = "public.image";
        UIImagePickerControllerOriginalImage = "<UIImage: 0x5cfd00>";
        UIImagePickerControllerReferenceURL = "assets-library://asset/asset.JPG?id=EFC44C3C-9C82-4669-924B-A2B9DE6F1F45&ext=JPG";
    }
    

    在这种情况下,它是一个 jpg,如 ext=JPG 所示

    【讨论】:

    • 我最终采用了上面详述的解决方案,但是这是非常好的信息,并且会使我的任务更加简单。谢谢!
    【解决方案2】:

    好的,所以我想通了。这可能不适用于所有场景,但对我来说已经足够了:

        CGImageAlphaInfo imgAlpha = CGImageGetAlphaInfo(theImage.CGImage);
    
        // Is this an image with transparency (i.e. do we need to save as PNG?)
        if ((imgAlpha == kCGImageAlphaNone) || (imgAlpha == kCGImageAlphaNoneSkipFirst) || (imgAlpha == kCGImageAlphaNoneSkipLast)) {
             // save as a JPEG
        } else {
             // save as a PNG
        }
    

    ...当然,您需要记住您保存的图像类型,为其指定适当的文件扩展名,然后重新加载正确的图像...但基本上这会处理它。具有透明度的图像将保存为 PNG,其他一切都保存为 JPEG。

    如果有人有更好的方法,我很想听听。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2015-08-28
      • 2012-05-01
      • 2012-05-10
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多