我已编写代码来生成pdf文件中的缩略图&将它们保存为png图片,但在iPad 2上成功运行的相同代码会在iPad 1上崩溃。
在加载乐器之后,我一眼就看到在生成6个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];
}
谢谢!
答案 0 :(得分:0)
致电
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
之前CGContextDrawPDFPage
解决了我的类似问题。
致于约翰恩的回答: CGContextDrawPDFPage taking up large amounts of memory