2010-06-04 84 views
8

我有一個PDF文件,我想以大綱形式繪製。我想在文檔中的前幾頁上繪製它們各自的UIImage,以便在按鈕上使用,以便單擊時主顯示將導航到單擊的頁面。佔用大量內存的CGContextDrawPDFPage

但是,CGContextDrawPDFPage似乎在嘗試繪製頁面時使用了大量的內存。儘管圖像的高度應該只有100px左右,但應用程序會在繪製一個頁面時崩潰,根據Instruments的規定,這個頁面只分配大約13 MB的內存。

這裏的繪圖代碼:

//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); 
} 

有沒有更好的方式來得出這樣的形象,不佔用大量的內存?

+0

在完成此線程後,您是如何更新視圖的? – 2011-01-27 21:05:35

回答

16

嘗試添加:

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

前:

CGContextDrawPDFPage(g, m_page); 

我也有類似的問題,增加了2函數調用以上導致使用5倍的內存更少的渲染。可能是CGContextXXX繪圖函數中的一個錯誤

+0

哇約翰,你太棒了! – aslisabanci 2011-08-11 08:28:20

+0

顯着更少的內存和顯着更快的渲染時間(這是什麼殺了我比內存使用更多)。跆拳道,這些應該是默認值。謝天謝地,我碰到了你的答案,約翰 - 謝謝。 – natbro 2012-04-05 03:41:43

0

看看我的代碼在GitHub上一個PDF圖像切片:

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

應該有一個13 MB分配不會殺了該應用的設備上足夠的內存。您每次渲染PDF時是否耗盡了自動釋放池?您可能還想將渲染緩存到UIImage中,以便每次顯示時都不必渲染它。

+0

好吧,問題不會通過查找結果來解決,因爲它試圖繪製第一個圖像時會崩潰。考慮到繪製圖像並不是當時發生的唯一事情(它也使用UIWebView來顯示完整的PDF文件),13 MB可能太多了。 – 2010-06-07 01:05:40

+0

嗨馬蒂, 你有沒有得到任何解決你的問題。 我也面臨同樣的問題。 如果您發現任何溶膠請與我分享。 謝謝 – CKT 2010-08-14 10:27:03