2013-07-14 37 views
1

在我的應用程序中,我有一個主視圖(使用它的UIGraphicsGetCurrentContext())和其他幾個CGContextRef畫布。他們都是相同的大小,屏幕的大小 - 沒有比例因子。在Retina顯示屏上的CGContextRef上繪畫

我在輔助畫布上畫畫,最後在輔助畫布上使用CGBitmapContextCreateImage,在主畫布上使用CGContextDrawImage畫出輔助畫布上的CGBitmapContextCreateImage。

在視網膜顯示結果差,所有線看起來像素化。 我應該如何處理視網膜顯示器上的繪畫?

以下是我使用繪製上下文向主上下文有關的代碼:

void CocoaGraphicsContext::drawContext(GraphicsContext* context, double x, double y, Box* cropBox, Matrix3D* matrix) 
{ 
    CGAffineTransform matInverted; 

    if (matrix != NULL) 
    { 
     CGAffineTransform transMat = CGAffineTransformMake(matrix->vx1, matrix->vy1, matrix->vx2, matrix->vy2, matrix->tx, matrix->ty); 
     matInverted = CGAffineTransformInvert(transMat); 

     CGContextConcatCTM(_cgContext, transMat); 
    } 

    CGImageRef cgImage = CGBitmapContextCreateImage(((CocoaGraphicsContext*)context)->cgContext()); 

    CGContextSaveGState(_cgContext); 
    CGContextSetInterpolationQuality(_cgContext, kCGInterpolationNone); 

    bool shouldCrop = ((cropBox != NULL) && (cropBox->valid())); 

    if (shouldCrop) 
    { 
     CGContextClipToRect(_cgContext, CGRectMake(cropBox->x(), cropBox->y(), cropBox->width(), cropBox->height())); 
    } 

    CGContextDrawImage(_cgContext, CGRectMake(x, y, context->width(), context->height()), cgImage); 

    CGContextRestoreGState(_cgContext); 

    CGImageRelease(cgImage); 

    if (matrix != NULL) 
    { 
     CGContextConcatCTM(_cgContext, matInverted); 
    } 
} 

主要上下文是使用UIGraphicsGetCurrentContext()從一個UIView類

採取----編輯 - - 初始化代碼:

void CocoaBitmapContext::init(double width, double height, unsigned int* data) 
{ 
    int bytesPerRow = width * 2 * VT_BITMAP_BYTES_PER_PIXEL; 

    if (data == NULL) 
    { 
     _dataOwner = true; 
     _data = (unsigned int*)malloc(bytesPerRow * height * 2); 
    } 
    else 
    { 
     _dataOwner = false; 
     _data = data; 
    } 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    _cgContext = CGBitmapContextCreate(_data, 
             width * 2, 
             height * 2, 
             VT_BITMAP_BITS_PER_COMPONENT, 
             bytesPerRow, 
             colorSpace, 
             kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little); 

    CGContextConcatCTM(_cgContext, CGAffineTransformMakeScale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale)); 

    CGContextSetShouldAntialias(_cgContext, false); 
    CGContextSetRGBStrokeColor(_cgContext, 0.0, 0.0, 0.0, 0.0); 

    CGColorSpaceRelease(colorSpace); 
} 
+0

您使用UIGraphicsGetCurrentContext()獲得的上下文已經縮放。你應該手動縮放你創建的。如果可能,我建議您使用CGBitmapContextGetWidth()和CGBitmapContextGetHeight()來獲取主要上下文的維度並使用這些維度來創建所有其他上下文。 –

+0

我不認爲你需要在這裏改變任何東西,除了你可以使用CGContextSaveGState()和CGContextRestoreGState()來恢復CTM。 –

+0

我可能不得不改變某些地方,因爲它目前看起來像素化 –

回答

3

位圖尺寸在如在屏幕上尺寸在點像素爲單位指定。您可以使用[UIScreen mainScreen].scale來獲得屏幕的比例因子。這是多少個像素點。對於具有視網膜顯示的設備,此值將爲2.您將需要按該因子縮放畫布的大小。在創建上下文後,您還應該立即連接縮放比例轉換。繪製圖像時,仍應使用屏幕邊界作爲目標矩形(縮放轉換負責縮放)。

CGSize canvasSize = [UIScreen mainScreen].bounds.size; 
CGFloat scale = [UIScreen mainScreen].scale; 
canvasSize.width *= scale; 
canvasSize.height *= scale; 

UIGraphicsBeginImageContext(canvasSize); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextConcatCTM(context, CGAffineTransformMakeScale(scale, scale)); 
... 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

如果您打算在圖像視圖中顯示它的圖像視圖應該充滿屏幕,這是contentMode應該是UIViewContentModeScaleToFill

+0

請查看其他信息我添加到原來的問題 - 我不知道我究竟是如何在使用比例因子我代碼 –

+3

那豈不是更好地使用'UIGraphicsBeginImageContextWithOptions'並通過比例因子呢? –