CGContextDrawPDFPage занимает большую часть памяти

У меня есть файл 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);
}

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

Ответ 1

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

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

до:

CGContextDrawPDFPage(g, m_page);

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

Ответ 2

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

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

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