iOS压缩来自nsdata的图像

时间:2011-09-13 21:35:56

标签: objective-c ios uiimage jpeg nsdata

我有一个下载jpeg图像的应用程序,但它们很大,比应用程序所需的大。我已经创建了一个可以下载图像的NSData的类。采用NSData并压缩图像的最佳方法是什么。

到目前为止,我见过的唯一途径是暂时将映像写入磁盘,访问它并压缩磁盘上的jpeg。

是否有另一种方法可以不必写入磁盘并直接压缩它并收到数据?

2 个答案:

答案 0 :(得分:3)

最好在应用程序下载之前压缩图像。但是,如果这超出了您的控制范围,请在之后压缩它们。

要将图像转换为其他格式,您可以使用CGImageDestination.h中定义的函数

我会创建一个转换给定图像的类方法的函数:

+ (NSData*)imageDataWithCGImage:(CGImageRef)CGimage UTType:(const CFStringRef)imageUTType desiredCompressionQuality:(CGFloat)desiredCompressionQuality
{
    NSData* result = nil;

    CFMutableDataRef destinationData = CFDataCreateMutable(kCFAllocatorDefault, 0);
    CGImageDestinationRef destinationRef = CGImageDestinationCreateWithData(destinationData, imageUTType, 1, NULL);
    CGImageDestinationSetProperties(destinationRef, (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:desiredCompressionQuality], (NSString*)kCGImageDestinationLossyCompressionQuality, nil]);
    if (destinationRef != NULL)
    {
        CGImageDestinationAddImage(destinationRef, CGimage, NULL);

        if (CGImageDestinationFinalize(destinationRef))
        {
            result = [NSData dataWithData:(NSData*)destinationData];
        }
    }
    if (destinationData)
    {
        CFRelease(destinationData);
    }
    if (destinationRef)
    {
        CFRelease(destinationRef);
    }
    return result;
}

图像类型可以是kUTTypePNG,但质量参数很可能不起作用。它也可以是kUTTypeJPEG2000满足您的需求。

您可以使用数据初始化新图像或将其保存到磁盘。

答案 1 :(得分:1)

如果您问我认为您在问什么,可以使用+imageWithData:创建一块NSData的UIImage对象。

NSData *imageData = // Get the image data here
UIImage *image = [UIImage imageWithData:data];