2011-12-28 101 views
9

我有一個與iPhone中的pdf繪圖相關的問題。當我在ipad中繪製pdf時,它工作正常,但在iphone的圖像質量不好。該圖像在灰色背景處包含黑點。
任何人都可以幫我解決這個問題嗎?保留圖像質量,同時將高分辨率pdf格式導入iphone?

謝謝。

- (UIImage *) imageForPageIndex:(NSUInteger)pageIndex { 
    UIImage *image = nil; 
    if ([delegate illustration_Enable]) 
    { 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(NULL, 
                pageSize.width, 
                pageSize.height, 
                8,      /* bits per component*/ 
                pageSize.width * 4, /* bytes per row */ 
                colorSpace, 
                kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
     CGColorSpaceRelease(colorSpace); 
     CGContextClipToRect(context, CGRectMake(0, 0, pageSize.width, pageSize.height)); 

     [self renderPageAtIndex:pageIndex OnContext:context]; 

     CGImageRef cgimage = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 
     image = [UIImage imageWithCGImage:cgimage]; 
     CGImageRelease(cgimage); 
    } 
    else 
    { 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(NULL, 
                pageSize.width, 
                pageSize.height, 
                8,      /* bits per component*/ 
                pageSize.width * 4, /* bytes per row */ 
                colorSpace, 
                kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
     CGColorSpaceRelease(colorSpace); 
     CGContextClipToRect(context, CGRectMake(0, 0, pageSize.width, pageSize.height)); 

     [self renderPageAtIndex:pageIndex OnContext:context]; 


     CGImageRef cgimage = CGBitmapContextCreateImage(context); 
     CGContextRelease(context); 
     image = [UIImage imageWithCGImage:cgimage]; 

     CGImageRelease(cgimage); 
    } 


    return image; 

} 

-(void)renderPageAtIndex:(int)index OnContext:(CGContextRef)ctx{ 

    if ([delegate illustration_Enable]) 
    { 
     if (index-1 == [imageList count]) { 
      return; 
     } 
     UIImage *image = nil; 
     image = [UIImage imageWithContentsOfFile:[imageList objectAtIndex:index-1]]; 
     CGRect rect1 = CGRectMake(0, 0, image.size.width, image.size.height); 
     CGRect rect2 = CGContextGetClipBoundingBox(ctx); 
     CGAffineTransform transform = [self aspectFill:rect1 :rect2]; 
     CGContextConcatCTM(ctx, transform); 
     CGContextDrawImage(ctx, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); 

    } 
    else 
    { 
     CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index); 
     CGRect rect1 = CGPDFPageGetBoxRect(page,kCGPDFMediaBox); 
     CGRect rect2 = CGContextGetClipBoundingBox(ctx); 
     CGAffineTransform transform; 
     if (takeBookmarkImg) 
     { 
      transform = [self aspectFill:rect1 :rect2]; 
     } 
     else 
     { 
      transform = [self aspectFit:rect1 :rect2]; 
     } 
     CGContextConcatCTM(ctx, transform); 
     CGContextDrawPDFPage(ctx, page); 
    } 



} 

- (CGAffineTransform) aspectFit:(CGRect)innerRect :(CGRect) outerRect { 

     scaleFactor = MIN(outerRect.size.width/innerRect.size.width, outerRect.size.height/innerRect.size.height); 
     baseScaleFactor = scaleFactor; 
     CGAffineTransform scale = CGAffineTransformMakeScale(scaleFactor, scaleFactor); 
     CGRect scaledInnerRect = CGRectApplyAffineTransform(innerRect, scale); 

     CGAffineTransform translation = 
     CGAffineTransformMakeTranslation((outerRect.size.width - scaledInnerRect.size.width)/2 - scaledInnerRect.origin.x-(totalMoveX+moveX), 
             (outerRect.size.height - scaledInnerRect.size.height)/2 - scaledInnerRect.origin.y+(totalMoveY+moveY)); 
     return CGAffineTransformConcat(scale, translation); 
} 

+2

您能向我們展示您認爲不足的代碼嗎? – johnluttig 2011-12-28 07:27:07

+1

我已經給出了我的代碼,我希望這將有助於完整答覆。 @johnluttig – 2011-12-28 11:15:39

+1

你能張貼一張圖片來展示iPad和iPhone版本之間的區別嗎?這可能是一個色彩空間問題,也可能是其他問題。 – user1118321 2012-01-03 06:50:20

回答

5

只是一個瘋狂的猜測,因爲它很難說沒有一些實際的截圖,但你不使用CGContextSetInterpolationQuality在你的渲染代碼。也許CGContextSetInterpolationQuality(your_context, kCGInterpolationHigh)解決了這個問題。

+0

感謝它爲我工作。@ roman – 2012-01-05 12:44:51