2011-06-15 53 views
2

我寫的代碼來生成PDF文件的縮略圖&它們保存爲PNG圖片,但成功運行在iPad 2會崩潰的iPad 1代用iPhone/iPad造成死機大的PDF文件的縮略圖

相同的代碼

加載了樂器之後,我發現在一次生成半打pdf的圖片時,內存使用量高達20MB,然後在CG繪圖完成後回落到正常水平,我很確定密集型內存加載導致崩潰,因爲我用加載正常圖片替換了代碼的那部分&它在兩個設備上都工作正常。

所以問題是:如何使用CG函數生成pdf縮略圖並儘可能少地使用內存?我正在考慮在後臺線程上運行它,但我認爲這不會以任何方式優化內存使用...

代碼也在縮略圖上應用漸變效果,這是一種功能要求...

下面的代碼:

+ (UIImage *)imageFromPDFWithDocumentRef:(NSString *)documentPath{ 
    CGPDFDocumentRef documentRef = CGPDFDocumentCreateWithURL((CFURLRef)[NSURL fileURLWithPath:documentPath]); 
    CGPDFPageRef pageRef = CGPDFDocumentGetPage(documentRef, 1); 
CGRect pageRect = CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox); 

if(pageRect.size.width >pageRect.size.height){ 
    pageRect.origin.x = (pageRect.size.width - pageRect.size.height)/2; 
    pageRect.size.width = pageRect.size.height; 

}else{ 
    pageRect.origin.y = (pageRect.size.height - pageRect.size.width)/2; 
    pageRect.size.height = pageRect.size.width; 
} 

UIGraphicsBeginImageContext(pageRect.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextTranslateCTM(context, CGRectGetMinX(pageRect),CGRectGetMaxY(pageRect)); 
CGContextScaleCTM(context, 1, -1); 
CGContextTranslateCTM(context, -(pageRect.origin.x), -(pageRect.origin.y)); 
CGContextDrawPDFPage(context, pageRef); 

CGGradientRef glossGradient; 
CGColorSpaceRef rgbColorspace; 
size_t num_locations = 2; 
CGFloat locations[2] = { 0.0, 1.0 }; 
CGFloat components[8] = { 1.0, 1.0, 1.0, 0.1, // Start color 
    0.0, 0.0, 1.0, 0.7 }; // End color 

rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations); 

CGRect currentBounds = pageRect; 

CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 800); 
CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), 0); 


CGContextDrawLinearGradient(context, glossGradient, topCenter, midCenter, 0); 

CGGradientRelease(glossGradient); 
CGColorSpaceRelease(rgbColorspace);  

CGRect thumbRect = CGRectMake(0, 0, 187, 187); 

UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
CGPDFDocumentRelease(documentRef); 

return [UICommon resizedImage:finalImage rect:thumbRect]; 
} 

謝謝!

回答