UIKit:为什么UIGraphicsGetImageFromCurrentImageContext使用的内存比 - [UIImage imageWithContentsOfFile]少得多?

时间:2015-02-07 19:20:43

标签: ios uiimage uikit

我的应用在UICollectionView中显示了一堆图片。我打电话的时候:

[UIImage imageWithContentsOfFile:thumbnailPath];

我的应用程序使用大约60mb的RAM作为我的测试图像集。

但是,当我接着执行以下操作时:

  UIImage* image = [UIImage imageWithContentsOfFile:thumbnailPath];

  // Pre-render the image to ensure there isn't lag later.
  CGSize imageSize = image.size;
  UIGraphicsBeginImageContext(imageSize);
  [image drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
  UIImage* preRenderedImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return preRenderedImage;

只有大约15mb的RAM。

在预渲染之前和之后图像比例是1.0,并且大小是相同的,所以我不确定是什么导致内存使用的差异。我也尝试使用UIGraphicsBeginImageContextWithOptions(imageSize, NO, 2.0);,这对内存使用没有影响。

类似:Why does my UIImage take up so much memory?

更新

以下是图片信息的转储:

----- original -------
CGImageGetHeight: 1024
CGImageGetWidth:  768
CGImageGetColorSpace: <CGColorSpace 0x174222e20> (kCGColorSpaceDeviceRGB)
CGImageGetBitsPerPixel:     32
CGImageGetBitsPerComponent: 8
CGImageGetBytesPerRow:      4096
CGImageGetBitmapInfo: 0x00000005
  kCGBitmapAlphaInfoMask     = YES
  kCGBitmapFloatComponents   = NO
  kCGBitmapByteOrderMask     = 0x00000000
  kCGBitmapByteOrderDefault  = YES
  kCGBitmapByteOrder16Little = NO
  kCGBitmapByteOrder32Little = NO
  kCGBitmapByteOrder16Big    = NO
  kCGBitmapByteOrder32Big    = NO

----- pre-rendererd -------
CGImageGetHeight: 1024
CGImageGetWidth:  768
CGImageGetColorSpace: <CGColorSpace 0x174222e20> (kCGColorSpaceDeviceRGB)
CGImageGetBitsPerPixel:     32
CGImageGetBitsPerComponent: 8
CGImageGetBytesPerRow:      4096
CGImageGetBitmapInfo: 0x00002002
  kCGBitmapAlphaInfoMask     = YES
  kCGBitmapFloatComponents   = NO
  kCGBitmapByteOrderMask     = 0x00002000
  kCGBitmapByteOrderDefault  = NO
  kCGBitmapByteOrder16Little = NO
  kCGBitmapByteOrder32Little = YES
  kCGBitmapByteOrder16Big    = NO
  kCGBitmapByteOrder32Big    = NO

请注意字节顺序的差异,这是有道理的,因为png文件是大端(PNG file format endianness?)。字节顺序是否会导致内存使用过多(可能是因为绘制前的转换)?这将是一个惊喜,因为PNG在iOS应用程序中被全部使用。

0 个答案:

没有答案