【问题标题】:Detect whether an UIImage is PNG or JPEG?检测 UIImage 是 PNG 还是 JPEG?
【发布时间】:2011-11-05 05:05:57
【问题描述】:

目前我正在通过 MonoTouch 进​​行 iPhone 开发的第一步,我正在使用从照片库中读取的 UIImage

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

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

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

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

有没有办法做到这一点,还是我错过了一些要点?

【问题讨论】:

    标签: iphone ios cocoa-touch xamarin.ios uiimage


    【解决方案1】:

    准备

    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) {
    
    }
    

    【讨论】:

      【解决方案2】:

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

      如果确保将其保存为原始格式对您的应用或算法很重要,我认为您必须保留该信息以在编写时使用。我仔细检查过,找不到任何宣传它来自什么格式的东西。

      您是要通过UIImageView 更改图像还是图像在您的体验中保持不变?如果它没有改变,你只需要 UI 来选择图像,你能得到文件字节吗?例如,如果您显示图像只是为了选择,然后将它们上传到服务器或其他东西,UIImage 只能用于查看和选择,如果您的数据结构记住它来自哪个文件,您可以获得位退出磁盘并上传。如果您在视图中更改文件,那么您或用户需要决定图像的输出(以及 jpeg 质量)。

      【讨论】:

      • 谢谢@bryanmac 基本上我正在编写一个小工具来从照片库中选择图像并通过网络服务上传。所以我不是在制作图像,而只是“消费”它。也许我可以在 FinishedPickingImage 覆盖的 NSDictionary editingInfo 参数中的某处获取原始字节?
      • 所以,如果我理解的话,如果照片最初上传为 PNG 或 JPEG 真的没关系...一旦你获得 UIImage,你可以将它转换为两种格式?
      • 如果有 Alpha 通道,那么您会想知道使用哪个通道。我拿了一个 jpeg 然后用 uiimage 显示它然后将它保存到本地数据库,我回想起来我应该把它保存到磁盘上,任何我使用 UIImagePNGRepresentation 而不是 UIImageJPEGRepresentation 的人,后来尝试恢复它,这是结果imgur.com/2yG3Zv2 如您所见,透明度被弄乱了。正如我所说,我可能应该将其保存到硬盘并存储路径,但关键是在某些情况下,您使用哪个功能确实很重要。
      • 如果您使用的是UIImagePickerController,请查看UIImagePickerControllerMediaType editing information key。然后,请参阅UTI Image Content Types
      猜你喜欢
      • 2011-04-15
      • 2012-02-20
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多