【问题标题】:Compressing and resizing large images for iOS为 iOS 压缩和调整大图像
【发布时间】:2011-06-23 05:06:36
【问题描述】:

我正在制作一个主要功能是在 tableview 中显示大图像的应用程序,其中一些可以是 1000 像素宽和 1MB+ 大小。

我发现较旧的设备 (3GS) 在处理这些问题时遇到了严重问题,并且会迅速发出内存警告。

我无法弄清楚要引入哪些图像,但我想我可以让它们在尺寸和文件大小上都更小。所以我研究了

NSData *dataForJPEGFile = UIImageJPEGRepresentation(img, 0.6)

用于压缩,但我认为这对内存警告没有帮助

调整大小如下:

UIImage *newImage;
UIImage *oldImage = [UIImage imageWithData:imageData] ;
UIGraphicsBeginImageContext(CGSizeMake(tempImage.size.width,tempImage.size.height)); 
[oldImage drawInRect:CGRectMake(0, 0,320.0f,heightScaled)];
newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();

还有https://github.com/AliSoftware/UIImage-Resize

基本上,我想拍摄一张图像并重新格式化,使其更小、尺寸和文件大小在运行中,然后删除旧的。这是最好的方法吗? 缓存图像有帮助吗?喜欢https://github.com/rs/SDWebImage 吗?

【问题讨论】:

    标签: iphone objective-c memory-management uiimage uiimagejpegrepresentation


    【解决方案1】:

    您可以使用CGImageSourceCreateThumbnailAtIndex调整大图像的大小而无需先完全解码它们,这将节省大量内存并防止崩溃/内存警告。

    如果你有想要调整大小的图片的路径,你可以使用这个:

    - (void)resizeImageAtPath:(NSString *)imagePath {
        // Create the image source (from path)
        CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);
    
        // To create image source from UIImage, use this
        // NSData* pngData =  UIImagePNGRepresentation(image);
        // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);
    
        // Create thumbnail options
        CFDictionaryRef options = (__bridge CFDictionaryRef) @{
                (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
                (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
                (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
        };
        // Generate the thumbnail
        CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
        CFRelease(src);
        // Write the thumbnail at path
        CGImageWriteToFile(thumbnail, imagePath);
    }
    

    更多详情here.

    【讨论】:

      【解决方案2】:

      table view 图像应该调整大小,当然,它甚至使它看起来比小框架中的大图像更好。现在,如果存储是一个问题,并且您有一个服务器,您可以在需要时从其中下载大图像,您可以在文件系统中实现某种缓存。最多只能在其中存储 nMB 的图像,每当请求一个当前不在文件系统中的新图像时,删除最近最少使用的(或其他东西)并下载新的图像。

      Ps:不要使用+[UIImage imageNamed:]。它的缓存算法中存在一些错误,或者它不会释放您使用它加载的图像。

      【讨论】:

      • 问题是,图片来自所有不同服务器的 RSS 提要,我们没有图片。
      • 我猜不是,实现“文件系统中的某种缓存”的最佳方法是什么?你有任何文档/链接等吗?
      猜你喜欢
      • 1970-01-01
      • 2018-02-25
      • 2012-07-30
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多