gpt4 book ai didi

ios - 在 Retina 显示屏上的 CGContextRef 上绘画

转载 作者:行者123 更新时间:2023-12-03 16:54:39 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个主视图(及其 UIGraphicsGetCurrentContext())和其他几个 CGContextRef Canvas 。它们的尺寸均相同,即屏幕尺寸 - 无比例因子。

我在辅助 Canvas 上进行绘制,最后在辅助 Canvas 上使用 CGBitmapContextCreateImage 并在主 Canvas 上使用 CGContextDrawImage 进行绘制。

在视网膜显示屏上,结果很差,所有线条看起来都像素化。我应该如何处理视网膜显示器上的绘画?

以下是我用来将上下文绘制到主上下文的代码:

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);
}
}

主要上下文是使用 UIView 类中的 UIGraphicsGetCurrentContext() 获取的

---- 已编辑 ---初始化代码:

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);
}

最佳答案

位图大小以像素为单位指定,而屏幕上的大小以磅为单位。您可以使用[UIScreen mainScreen].scale获取屏幕的比​​例因子。这就是一个点有多少个像素。对于配备视网膜显示屏的设备,该值将为 2。您需要按该系数缩放 Canvas 的大小。您还应该在创建上下文后立即连接比例变换。当您绘制图像时,您仍然应该使用屏幕边界作为目标矩形(比例变换负责缩放)。

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

如果要在 ImageView 中显示它,则 ImageView 应填满屏幕,并且其 contentMode 应为 UIViewContentModeScaleToFill

关于ios - 在 Retina 显示屏上的 CGContextRef 上绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17637840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com