2010-06-04 6 views
8

J'ai un fichier PDF que je veux dessiner sous forme de contour. Je veux dessiner les premières pages du document, chacune dans leur propre UIImage, à utiliser sur un bouton de sorte que lorsqu'on clique dessus, l'affichage principal navigue jusqu'à la page cliquée. Toutefois, CGContextDrawPDFPage semble utiliser de grandes quantités de mémoire lors de la tentative de dessin de la page. Même si l'image n'est censée être que d'environ 100px, l'application se bloque en dessinant une page en particulier, ce qui, selon Instruments, alloue environ 13 Mo de mémoire pour une seule page.CGContextDrawPDFPage occupant de grandes quantités de mémoire

Voici le code pour le dessin:

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

est-il une meilleure façon de dessiner cette image qui ne prend pas d'énormes quantités de mémoire?

+0

Comment avez-vous procédé à la mise à jour de la vue une fois ce fil terminé? –

Répondre

16

Essayez d'ajouter:

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

avant:

CGContextDrawPDFPage(g, m_page); 

J'ai eu un problème similaire et en ajoutant l'appel 2 fonction ci-dessus a entraîné le rendu en utilisant 5x moins de mémoire. Peut-être un bogue dans les fonctions de dessin CGContextXXX

+0

Wow Johann vous êtes génial! – aslisabanci

+0

nettement moins de mémoire et un temps de rendu nettement plus rapide (ce qui me tue plus que l'utilisation de la mémoire). wtf, ceux-ci devraient être les valeurs par défaut. Dieu merci, je suis tombé sur votre réponse, Johann - merci. – natbro

0

Jetez un oeil à mon code pour une trancheuse image PDF sur github:

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

Il mémoire devrait être suffisant sur le dispositif qu'une allocation de 13 Mo ne va pas tuer l'application. Etes-vous drainer le pool autorelease chaque fois que vous affichez un PDF? Vous pouvez également mettre en cache le rendu dans un UIImage afin qu'il n'ait pas à le rendre chaque fois qu'il est affiché.

+0

Eh bien, le problème ne va pas être résolu en chaching le résultat, car il se bloque en essayant de dessiner la toute première image. Et considérant que dessiner l'image n'est pas la seule chose qui se passe à ce moment-là (il utilise aussi un UIWebView pour afficher le fichier PDF complet), 13 Mo peut être tout simplement trop. –

+0

Salut Ed Marty, Avez-vous trouvé une solution à votre problème? Je suis également confronté au même problème. si vous avez trouvé un sol s'il vous plaît partager avec moi. Merci – CKT

Questions connexes