【问题标题】:reseting CGContextRef after drawing pdf page using CGContextDrawPDFPage使用 CGContextDrawPDFPage 绘制 pdf 页面后重置 CGContextRef
【发布时间】:2011-03-13 18:58:00
【问题描述】:

我正在尝试为 PDF 文档中的每个 pdf 页面创建缩略图并将其放置在 UISCrollVIew 中。我已经成功了,但是当滚动太快时,滚动并没有我想要的那么流畅。 我想优化为 Pdf 页面创建的拇指图像。 我想创建一个 CGContextRef 并在 CGContextDrawPDFPage 之后重置其内容,因此我不必每次都创建上下文并执行一些其他计算,这会占用大量资源。

是否可以在 CGContextDrawPDFPage 之后重置 CGContextRef 内容? CGContextRestoreGState 和 CGContextSaveGState 在这种情况下似乎没有帮助。

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

和 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);

}

【问题讨论】:

    标签: iphone objective-c quartz-2d


    【解决方案1】:

    试试CGContextClearRect(context, contextBounds)

    CGContextSaveGState 和 CGContextRestoreGState 对上下文的内容没有任何影响。它们推送和弹出对上下文的状态方面所做的更改,例如当前填充颜色。

    【讨论】:

    • 谢谢!它有效,现在我不必每次绘制 pdf 页面时都创建上下文 :) CGContextClearRect(context, CGContextGetClipBoundingBox(context));它并没有像我预期的那样有帮助(滚动速度太快就不那么流畅了),但无论如何它比以前更好了。
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多