【问题标题】:How do I convert UIImage to J2K (JPEG2000) in iOS?如何在 iOS 中将 UIImage 转换为 J2K (JPEG2000)?
【发布时间】:2013-11-13 23:52:46
【问题描述】:

我已经设法让 OpenJPEG 在我的 iOS 应用程序中编译,但我不知道从哪里开始尝试将 UIImage 转换为 J2K 文件或内存缓冲区中的 J2K。有什么建议吗?

【问题讨论】:

  • J2K?您想保存 Jpeg 2000 文件吗?我在 Mac OS 中做到了这一点,但在 iOS 中没有。在文档中浏览一下,我认为您必须创建一个 CGImageDestination 并给它一种 kUTTypeJPEG2000。
  • 我会试试这个,看看它是否适用于 iOS,谢谢。
  • @DuncanC 这工作得非常好,并产生了比 JPG 更小的图像,并保留了透明度。非常感谢您指出这一点。

标签: ios jpeg2000


【解决方案1】:

显然 ImageIO 可以做到这一点。您需要将图像 io 框架添加到您的项目中,然后此代码对我有用:

#import <ImageIO/ImageIO.h> // or @import ImageIO if modules enabled
#import <MobileCoreServices/MobileCoreServices.h>

// ...    

// quality is 0-1 (0 = smallest file size, 1 = lossless quality)
+ (NSData*) convertToJPEG2000:(UIImage*)image withQuality:(float)quality
{
    NSMutableData* d = [NSMutableData data];
    CGImageDestinationRef destinationRef = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)d, kUTTypeJPEG2000, 1, NULL);
    CGImageDestinationSetProperties(destinationRef, NULL);
    CGImageDestinationAddImage(destinationRef, image.CGImage, (__bridge CFDictionaryRef)@{ (NSString*)kCGImageDestinationLossyCompressionQuality: @(quality) });

    if (!CGImageDestinationFinalize(destinationRef))
    {
        d = nil;
    }
    CFRelease(destinationRef);

    return d;
}

【讨论】:

  • 上次检查,iOS 不支持kUTTypeJPEG2000。存在类型标识符常量,但编码不起作用。您尝试了哪个版本的 iOS?
  • 这适用于 iOS 5+。尚未测试早期的 iO​​S 版本。
  • 看起来它在 iOS 3+ 上受支持 - extern const CFStringRef kUTTypeJPEG2000 __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_3_0);
  • 在 iOS 7 上,您需要导入 才能使用 kUTTypeJPEG2000。
  • @PsychoDad 你知道转换到 jpeg2000 是否像以前一样慢?或者使用更新的设备/版本的 iOS 性能是否更好?
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多