2010-06-04 4 views
8

Ich habe eine PDF-Datei, die ich in Umrissform zeichnen möchte. Ich möchte die ersten paar Seiten des Dokuments jeweils in ihrer eigenen UIImage zeichnen, um sie auf einer Schaltfläche zu verwenden, so dass beim Anklicken die Hauptanzeige zur angeklickten Seite navigiert.CGContextDrawPDFPage nimmt große Mengen an Speicher auf

CGContextDrawPDFPage scheint jedoch beim Versuch, die Seite zu zeichnen, reichlich Speicher zu belegen. Obwohl das Bild nur etwa 100 Pixel groß sein soll, stürzt die Anwendung beim Zeichnen einer Seite ab, was laut Instruments etwa 13 MB Speicher nur für die eine Seite zuweist.

Hier ist der Code für das Zeichnen:

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

Gibt es einen besseren Weg, um dieses Bild zu zeichnen, die nicht riesige Mengen an Speicher in Anspruch nehmen?

+0

Wie sind Sie nach der Fertigstellung dieses Threads zum Aktualisieren der Ansicht gegangen? –

Antwort

16

Versuchen hinzuzufügen:

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

vor:

CGContextDrawPDFPage(g, m_page); 

ich ein ähnliches Problem hatte und das Hinzufügen der 2-Funktionsaufruf in der Wiedergabe resultiert vor 5x mit weniger Speicher. Könnte ein Fehler in den CGContextXXX Zeichnungsfunktionen sein

+0

Wow Johann, du bist großartig! – aslisabanci

+0

dramatisch weniger Speicher und dramatisch schnellere Renderzeit (was mich mehr als die Speicherauslastung tötete). wtf, das sollten die Standardwerte sein. Gott sei Dank, ich lief über deine Antwort, johann - danke. – natbro

0

Werfen Sie einen Blick auf meinem Code für ein PDF-Bildfeldzerleger auf GitHub:

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

Es sollte genügend Speicher auf dem Gerät sein, das eine 13 MB Zuteilung nicht die App töten wird. Leeren Sie den Autorelease-Pool jedes Mal, wenn Sie eine PDF-Datei rendern? Sie können das Rendering auch in einem UIImage zwischenspeichern, damit es nicht bei jeder Anzeige neu gerendert werden muss.

+0

Nun, das Problem wird nicht durch Chaching des Ergebnisses behoben, da es beim Versuch, das allererste Bild zu zeichnen, abstürzt. Und wenn man bedenkt, dass das Zeichnen nicht das einzige ist, was zu der Zeit passiert (es verwendet auch ein UIWebView, um die vollständige PDF-Datei anzuzeigen), sind 13 MB einfach zu viel. –

+0

Hi Ed Marty, Haben Sie eine Lösung für Ihr Problem gefunden? Ich bin auch mit dem gleichen Problem konfrontiert. Wenn Sie irgendein Sol gefunden haben, bitte teilen Sie mit mir. Danke – CKT