2011-12-28 16 views
9

Mam problem związany z rysowaniem pdf w telefonie iPhone. Kiedy rysuję pdf w iPadzie, działa dobrze, ale w jakości obrazu nie jest dobry. Ten obraz zawiera ciemne plamy w miejscu szarego tła.
Czy ktoś może mi pomóc rozwiązać ten problem?zachowując jakość obrazu podczas rysowania w wysokiej rozdzielczości plików PDF do iPhone?

dzięki.

- (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

Czy możesz pokazać nam swój kod, który uważasz za nieodpowiedni? – johnluttig

+1

Podałem mój kod i mam nadzieję, że będzie to pomocne dzięki za udzielenie odpowiedzi. @johnluttig –

+1

Czy możesz opublikować zdjęcie pokazujące różnicę między wersjami na iPada i iPhone'a? Może to być problem z przestrzenią kolorów lub może być czymś zupełnie innym. – user1118321

Odpowiedz

5

Po prostu dzikie domysły, ponieważ trudno powiedzieć bez rzeczywistych zrzutów ekranu, ale nie używasz CGContextSetInterpolationQuality w kodzie renderowania. Może CGContextSetInterpolationQuality(your_context, kCGInterpolationHigh) rozwiązuje problem.

+0

dziękuję to działało dla mnie. @ Roman –

Powiązane problemy