2010-07-09 5 views
1

J'essaye de créer des images de pouce pour chaque pdf page dans le document de pdf et le place dans un UISCrollVIew. J'ai réussi, mais défiler n'est pas aussi lisse que je le veux quand c'est trop rapide. Et je veux optimiser les images de pouce en créant pour la page Pdf. Je veux créer un CGContextRef et réinitialiser son contenu après CGContextDrawPDFPage, par conséquent je n'aurais pas besoin de créer un contexte à chaque fois et d'effectuer d'autres calculs, ce qui nécessite beaucoup de ressources.réséquer CGContextRef après avoir dessiné la page pdf en utilisant CGContextDrawPDFPage

Est-il possible de réinitialiser le contenu CGContextRef après CGContextDrawPDFPage? CGContextRestoreGState et CGContextSaveGState ne semble pas aider dans cette situation.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
GCPdfSource *pdfSource = [GCPdfSource sharedInstance]; 
for (int i = pageRange.location; i <= pageRange.length; i++) { 

    UIView *thumbPdfView = [scrollView viewWithTag:i+1]; 
    if (thumbPdfView == nil) { 

     CGPDFPageRef pdfPage = [pdfSource pageAt:i + 1]; 
     float xPosition = THUMB_H_PADDING + THUMB_H_PADDING * i + THUMB_WIDTH * i; 

     CGRect frame = CGRectMake(xPosition, THUMB_H_PADDING, THUMB_WIDTH, THUMB_HEIGHT); 
     thumbPdfView = [[UIView alloc] initWithFrame:frame]; 
     thumbPdfView.opaque = YES; 
     thumbPdfView.backgroundColor = [UIColor whiteColor]; 
     [thumbPdfView setTag:i+1]; 

     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(NULL, 
             frame.size.width, 
             frame.size.height, 
             8,      /* bits per component*/ 
             frame.size.width * 4, /* bytes per row */ 
             colorSpace, 
             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
     CGColorSpaceRelease(colorSpace); 
     CGContextClipToRect(context, CGRectMake(0, 0, frame.size.width,frame.size.height)); 


     CGRect pdfPageRect = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox); 
     CGRect contextRect = CGContextGetClipBoundingBox(context); 
     CGAffineTransform transform = aspectFit(pdfPageRect, contextRect); 

     CGContextConcatCTM(context, transform); 
     CGContextDrawPDFPage(context, pdfPage); 


     CGImageRef image = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 
     UIImage *uiImage = [[UIImage alloc]initWithCGImage:image]; 
     CGImageRelease(image); 

     UIImageView *imageVIew = [[UIImageView alloc]initWithImage:uiImage]; 
     [uiImage release]; 

     [thumbPdfView addSubview:imageVIew]; 
     [imageVIew release]; 

     [scrollView addSubview:thumbPdfView]; 
     [thumbPdfView release]; 

    } 
} 

[pool release];//release 

et la fonction aspectFit ...

CGAffineTransform aspectFit(CGRect innerRect, CGRect outerRect) { 
CGFloat scaleFactor = MIN(outerRect.size.width/innerRect.size.width, outerRect.size.height/innerRect.size.height); 
CGAffineTransform scale = CGAffineTransformMakeScale(scaleFactor, scaleFactor); 
CGRect scaledInnerRect = CGRectApplyAffineTransform(innerRect, scale); 
CGAffineTransform translation = 
CGAffineTransformMakeTranslation((outerRect.size.width - scaledInnerRect.size.width)/2 - scaledInnerRect.origin.x, 
           (outerRect.size.height - scaledInnerRect.size.height)/2 - scaledInnerRect.origin.y); 
return CGAffineTransformConcat(scale, translation); 

}

Répondre

0

Essayez CGContextClearRect(context, contextBounds).

CGContextSaveGState et CGContextRestoreGState n'ont aucun effet sur le contenu d'un contexte. Ils poussent et font apparaître les changements apportés aux aspects du contexte tels que la couleur de remplissage actuelle.

+0

Merci! Cela fonctionne, maintenant je n'ai pas besoin de créer un contexte chaque fois que je dessine une page pdf :) CGContextClearRect (context, CGContextGetClipBoundingBox (context)); Cela n'a pas aidé comme je m'y attendais (ce n'est pas si lisse sur un défilement trop rapide) mais de toute façon c'est mieux qu'avant. – Koteg