0

我使用以下方法创建了新的 CGContext:

        NSUInteger width = newRect.size.width;
        NSUInteger height = newRect.size.height;

        NSUInteger bytesPerPixel = 4;
        NSUInteger bytesPerRow = bytesPerPixel * width;
        NSUInteger bitsPerComponent = 8;

        UInt32 * pixels;
        pixels = (UInt32 *) calloc(height * width, sizeof(UInt32));
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

        CGContextRef context = CGBitmapContextCreate(pixels, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little);

        CGContextSetShouldAntialias(self.graphContext, false);
        CGContextSetInterpolationQuality(self.graphContext, kCGInterpolationHigh);

当我尝试使用此上下文绘制圆圈或文本时,我会得到如下奇怪的模糊对象:

在此处输入图像描述

在此处输入图像描述

当我将 CGContextSetShouldAntialias 设置为真实图像时,图像变得过于模糊:

在此处输入图像描述

在此处输入图像描述

我希望文本和图像变得像通常的标签或视图(不模糊但不模糊)。我只能使用这种方法来获取 CGContextRef。

我绘制文本的代码:

CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, rect );

NSAttributedString* attString = [[NSAttributedString alloc]
                                  initWithString:text
                                  attributes:self.attributes];

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString);

CTFrameRef frame = CTFramesetterCreateFrame(framesetter,
                         CFRangeMake(0, [attString length]), path, NULL);

CTFrameDraw(frame, self.graphContext);

CFRelease(frame);
CFRelease(path);
CFRelease(framesetter);

画圆的代码:

    CGRect minPath = CGRectMake(xPoint - extremaPointWidth / 2, minY - extremaPointWidth /2, extremaPointWidth, extremaPointWidth);

    CGContextAddPath(self.graphContext, createRoundedCornerPath(minPath, cornerRadius));
    CGContextFillPath(self.graphContext);

创建舍入路径

// create a mutable path
CGMutablePathRef path = CGPathCreateMutable();

// get the 4 corners of the rect
CGPoint topLeft = CGPointMake(rect.origin.x, rect.origin.y);
CGPoint topRight = CGPointMake(rect.origin.x + rect.size.width, rect.origin.y);
CGPoint bottomRight = CGPointMake(rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);
CGPoint bottomLeft = CGPointMake(rect.origin.x, rect.origin.y + rect.size.height);

CGPathMoveToPoint(path, NULL, topLeft.x + cornerRadius, topLeft.y);

CGPathAddLineToPoint(path, NULL, topRight.x - cornerRadius, topRight.y);

CGPathAddQuadCurveToPoint(path, NULL, topRight.x, topRight.y, topRight.x, topRight.y + cornerRadius);

CGPathAddLineToPoint(path, NULL, bottomRight.x, bottomRight.y - cornerRadius);

CGPathAddQuadCurveToPoint(path, NULL, bottomRight.x, bottomRight.y, bottomRight.x - cornerRadius, bottomRight.y);

CGPathAddLineToPoint(path, NULL, bottomLeft.x + cornerRadius, bottomLeft.y);

CGPathAddQuadCurveToPoint(path, NULL, bottomLeft.x, bottomLeft.y, bottomLeft.x, bottomLeft.y - cornerRadius);

CGPathAddLineToPoint(path, NULL, topLeft.x, topLeft.y + cornerRadius);

CGPathAddQuadCurveToPoint(path, NULL, topLeft.x, topLeft.y, topLeft.x + cornerRadius, topLeft.y);

return path;

谢谢。

更新:当我只画直线或矩形时很好

4

1 回答 1

1

我得到像这些奇怪的模糊物体

不,你没有。你得到一个位图。你必须做一些别的事情才能得到一个你可以看到的对象——你还没有展示你做了什么。但这不是问题的全部吗?您必须将位图转换为 UIImage,这需要代码。如果您以块状、像素化的方式进行操作,您将获得块状、像素化的结果。

我使用了您的位图上下文代码并在其中画了一个实心圆圈,然后将位图上下文转换为 UIImage 并将该 UIImage 放入 UIImageView 中,它看起来像这样:

在此处输入图像描述

嗯,似乎很顺利。因此,问题肯定不是您的位图上下文,而是您如何从那里到达可见的东西才是问题所在。

但是,就我个人而言,我不明白你为什么要这么麻烦。如果您的目标是生成要在界面中显示的图像,为什么UIGraphicsBeginImageContextWithOptions不像其他人一样使用?

于 2016-11-08T20:24:46.430 回答