2017-04-24 64 views
1

我試圖旋轉用相機拍攝的2448x3264的UIImage。當我這樣做時,內存大約120Mb,大致3/4秒,然後恢復到正常狀態。問題在於,在內存較少的設備(例如ipod touch)中,應用程序崩潰。即使沒有,我也不認爲它應該爲一張圖片使用那麼多的內存。發生這種情況時,Iphone 5也落後了。CG光柵數據對於一個圖像太大

根據this回答一個評論,使用UIGraphicsGetCurrentContext()應該是寬度之後在所述解壓縮存儲器的字節大小×高度×CGImageGetBitsPerComponent(image.CGImage)/ 8個字節,因此圖像應占據8MB,不120 。

任何想法爲什麼發生這種情況,以及如何解決它?

這裏的UIImage的caterogy方法返回一個旋轉的圖像:

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees { 
    CGFloat radian = (CGFloat) (degrees * (M_PI/ 180.0f)); 
    CGSize rotatedSize = [self rotatedImageSize:degrees]; 

    // Create the bitmap context 
    UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, 0); 
    CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

    CGPoint contextCenter = CGPointMake(rotatedSize.width/2.0f, 
rotatedSize.height/2.0f); 
    CGContextTranslateCTM(bitmap, contextCenter.x, contextCenter.y); 

    // // Rotate the image context 
    CGContextRotateCTM(bitmap, radian); 
    // Now, draw the rotated/scaled image into the context 
    [self drawInRect:CGRectMake(-self.size.width/2.0f, - 
self.size.height/2.0f, self.size.width, self.size.height)]; 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

下面是儀器證明柵格數據是什麼導致內存高峯期,只是在執行rotate方法:

​​

回答

0

的幾點意見:

  • 2448x3264x(比如4個字節/像素)約爲30兆字節。
  • 不要旋轉它。如果它正在屏幕上顯示,則可以使用視圖的transform屬性。如果它進入一個文件,並且旋轉是8個exif方向之一,則編寫說明哪個方向的元數據。同樣,如果它來自文件,請使用Image I/O並請求CGImageSourceRef生成一個您需要將其放在屏幕上的大小的定向縮略圖。 (提示使用kCGImageSourceThumbnailMaxPixelSize和kCGImageSourceCreateThumbnailWithTransform。)對於任意角度,您可以使用CoreImage過濾器,該過濾器可以將圖像旋轉並縮減爲屏幕所需的大小(在GPU上)。同樣,您可以使用vImage在CPU上執行相同的操作(提示vImageAffineWarpCG_ARGB8888)。 vImage速度非常快,它可以爲您提供比核心圖形更好的重採樣。等等...如果它傷害,不要這樣做。
  • 在將角度轉換爲旋轉矩陣之前,您應該暫停。例如,如果你的角度是90度,你想要的矩陣就是[0 1 -1 0 0 0],並且你的重採樣代碼比你計算的近似結果更快樂。旋轉矩陣是[cos(t)sin(t)-sin(t)cos(t)0 0]。客戶可能已經可以直接通過餘弦和正弦。