Создание больших миниатюр PDF-файлов, вызывающих сбой на iPhone / iPad - PullRequest
2 голосов
/ 15 июня 2011

Я написал код для создания миниатюр из PDF-файлов и сохранения их в виде изображений PNG, но тот же код, который успешно работает на iPad 2, может привести к сбою на iPad 1.

После загрузки инструментов я увидел, что в какой-то момент использование памяти увеличивается до 20 Мб при генерации картинок для полдюжины pdf-файлов, а затем после возврата в CG рисунок возвращается к нормальному уровню, я уверен, что интенсивная загрузка памяти вызывает сбой, потому что я заменил эту часть кода загрузкой обычных картинок, и она работала нормально на обоих устройствах.

Таким образом, вопрос заключается в следующем: как создать миниатюры в формате pdf с функциями CG и использовать как можно меньше памяти? Я думаю запустить его в фоновом потоке, но не думаю, что это каким-либо образом оптимизирует использование памяти ...

Код также применяет эффект градиента к миниатюре, это функциональное требование ...

Вот код:

+ (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];
} 

Спасибо!

1 Ответ

0 голосов
/ 11 августа 2011

Вызов

CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

до того, как CGContextDrawPDFPage решил мою аналогичную проблему.

Кредиты идут на этот ответ Иоганна: CGContextDrawPDFPage занимает большой объем памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...