CGContextDrawPDFPage занимает большой объем памяти - PullRequest
9 голосов
/ 04 июня 2010

У меня есть файл PDF, который я хочу нарисовать в форме контура. Я хочу нарисовать первые несколько страниц документа, каждая из которых имеет собственный UIImage для использования на кнопке, чтобы при щелчке основной экран переходил к нажатой странице.

Однако CGContextDrawPDFPage, по-видимому, использует обильное количество памяти при попытке нарисовать страницу. Хотя предполагается, что изображение имеет высоту всего около 100 пикселей, приложение вылетает при рисовании одной страницы, которая, согласно Инструментам, выделяет около 13 МБ памяти только для одной страницы.

Вот код для рисования:

//Note: This is always called in a background thread, but the autorelease pool is setup elsewhere
+ (void) drawPage:(CGPDFPageRef)m_page inRect:(CGRect)rect inContext:(CGContextRef) g { 
    CGPDFBox box = kCGPDFMediaBox;
    CGAffineTransform t = CGPDFPageGetDrawingTransform(m_page, box, rect, 0,YES);
    CGRect pageRect = CGPDFPageGetBoxRect(m_page, box);

    //Start the drawing
    CGContextSaveGState(g);

    //Clip to our bounding box
    CGContextClipToRect(g, pageRect);   

    //Now we have to flip the origin to top-left instead of bottom left
    //First: flip y-axix
    CGContextScaleCTM(g, 1, -1);
    //Second: move origin
    CGContextTranslateCTM(g, 0, -rect.size.height);

    //Now apply the transform to draw the page within the rect
    CGContextConcatCTM(g, t);

    //Finally, draw the page
    //The important bit.  Commenting out the following line "fixes" the crashing issue.
    CGContextDrawPDFPage(g, m_page);

    CGContextRestoreGState(g);
}

Есть ли лучший способ нарисовать это изображение, которое не занимает много памяти?

Ответы [ 2 ]

16 голосов
/ 19 ноября 2010

Попробуйте добавить:

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

до:

CGContextDrawPDFPage(g, m_page);

У меня была похожая проблема, и добавление вышеупомянутого вызова функции 2 привело к рендерингу с использованием в 5 раз меньше памяти. Может быть ошибка в функциях рисования CGContextXXX

0 голосов
/ 05 июня 2010

Взгляните на мой код для слайсера изображений PDF на github:

http://github.com/luciuskwok/Maps-Slicer

На устройстве должно быть достаточно памяти, чтобы выделение 13 МБ не убивало приложение. Вы сливаете пул авто-релизов каждый раз, когда создаете PDF-файл? Возможно, вы также захотите кэшировать рендеринг в UIImage, чтобы он не отображал его каждый раз при отображении.

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