2013-07-14 33 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'并通过比例因子呢? –