检测UIImage是PNG还是JPEG格式?

24

我正在通过MonoTouch开始我的iPhone开发初体验,我正在使用从照片库中读取的UIImage进行尝试。

我想要实现的是获取图像的原始字节数组(byte[])。

我知道在MonoTouch中有UIImageJPEGRepresentationUIImagePNGRepresentation包装器。我也知道如何使用它们。但我不知道的是:

我该决定调用这两个函数中的哪一个?

也就是说,如果原始图像是JPEG图像,我不想将其作为PNG而是想要JPEG格式,反之亦然。

有没有方法可以实现这一点,还是我在这方面缺少了一些要点?

2个回答

32

一旦您有了一个UIImage,它就可以使用UIImageJPEGRepresentationUIImagePNGRepresentation生成JPEG或PNG格式。原始图像的格式只有在创建UIImage时才重要(决定加载哪个CFImage提供程序)。

如果对您的应用程序或算法来说很重要确保将其保存为原始格式,我认为您必须在编写它时保留该信息。 我仔细检查过,没有找到任何广告来源显示它来自哪种格式。

您是否会通过UIImageView更改图像,还是在您的体验中图像保持不变? 如果没有更改,而您只需要UI选择图像,则可以访问文件字节吗?例如,如果您只是展示图像以选择,然后上传到服务器或其他地方,则UIImage只能用于查看和选择,如果您的数据结构记住了它来自哪个文件,则可以从磁盘上取回位并上传。 如果您正在视图中更改文件,则您或用户需要决定图像的输出(以及如果jpeg,则为图像质量)。


谢谢,@bryanmac。基本上我正在编写一个小工具,从照片库中选择一张图片并通过 Web 服务上传它。所以我不是产生这个图像,而只是“使用”它。也许我可以在FinishedPickingImage重载的NSDictionary editingInfo参数的某个地方获得原始字节? - Uwe Keim
1
所以,如果我理解正确的话,照片最初是以PNG或JPEG格式上传并不重要...一旦你获得UIImage,你可以将其转换为两种格式? - Fustigador
1
如果有Alpha通道,那么你需要知道要使用哪个。我拿了一张JPEG图片,然后使用UIImage将其显示,再保存到本地数据库,回想起来我应该直接保存到磁盘上,用的是UIImagePNGRepresentation而不是UIImageJPEGRepresentation,后来尝试恢复它,结果如下:http://imgur.com/2yG3Zv2 你可以看到透明度混乱了。正如我所说,也许我应该把它保存到硬盘上并存储路径,但关键是在某些情况下使用哪个函数确实很重要。 - Yogurt
3
如果你正在使用 UIImagePickerController,请查看 UIImagePickerControllerMediaType 编辑信息键。然后,请参考UTI Image Content Types - ma11hew28

0

准备

typedef NS_ENUM(NSInteger, DownloadImageType) {
    DownloadImageTypePng,
    DownloadImageTypeJpg
};

@property (assign, nonatomic) DownloadImageType imageType;

检测

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    NSString *compareString = [[info objectForKey:UIImagePickerControllerReferenceURL] absoluteString];
    NSRange pngRange = [compareString rangeOfString:@"PNG" options:NSBackwardsSearch];
    if (pngRange.location != NSNotFound) {
        compareString = [compareString substringFromIndex:pngRange.location];
        self.imageType = DownloadImageTypePng;
        NSLog(@"%@", compareString);
    } else {
        NSLog(@"Not PNG");
    }

    NSRange jpgRange = [compareString rangeOfString:@"JPG" options:NSBackwardsSearch];
    if (jpgRange.location != NSNotFound) {
        compareString = [compareString substringFromIndex:jpgRange.location];
        self.imageType = DownloadImageTypeJpg;
        NSLog(@"%@", compareString);
    } else {
        NSLog(@"Not JPG");
    }

}

使用

if (self.imageType == DownloadImageTypePng) {

} else if (self.imageType == DownloadImageTypeJpg) {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接