我有一个PDF文件,我想以大纲形式绘制。我想在他们自己的UIImage中绘制文档的前几页,以便在按钮上使用,这样当点击时,主显示将导航到点击的页面。
但是,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 :(得分:16)
尝试添加:
CGContextSetInterpolationQuality(g, kCGInterpolationHigh);
CGContextSetRenderingIntent(g, kCGRenderingIntentDefault);
之前:
CGContextDrawPDFPage(g, m_page);
我遇到了类似的问题,并且上面添加了2个函数调用导致渲染使用的内存减少了5倍。可能是CGContextXXX绘图函数中的错误
答案 1 :(得分:0)
在github上查看我的代码以获取PDF图像切片器:
http://github.com/luciuskwok/Maps-Slicer
设备上应该有足够的内存,13 MB的分配不会杀死应用程序。每次渲染PDF时,您是否正在耗尽自动释放池?您可能还希望将渲染缓存到UIImage中,这样它就不必在每次显示时都渲染它。