在我的應用程序中,我有一個主視圖(使用它的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);
}
您使用UIGraphicsGetCurrentContext()獲得的上下文已經縮放。你應該手動縮放你創建的。如果可能,我建議您使用CGBitmapContextGetWidth()和CGBitmapContextGetHeight()來獲取主要上下文的維度並使用這些維度來創建所有其他上下文。 –
我不認爲你需要在這裏改變任何東西,除了你可以使用CGContextSaveGState()和CGContextRestoreGState()來恢復CTM。 –
我可能不得不改變某些地方,因爲它目前看起來像素化 –