iOS倒置坐标混乱问题

3

我正在使用CGBitmapContext将一个软件blitter适配到iOS上。我将数据写入位图,然后使用CoreGraphics函数在CGBitmapContext上写入文本。软件blitter使用左上角原点,而CoreGraphics函数使用左下角原点。因此,当我在(0,0)处使用blitter绘制图像时,它出现在左上角。当我使用CG在(0,0)处绘制文本时,它出现在左下角,且未被倒转。是的,我已经阅读了所有其他关于倒转坐标的问题,并将结果CG图像反转以正确显示视图。也许一个代码示例会有所帮助...

    // This image is at the top left corner using the custom blitter.
screen->write(image, ark::Point(0, 0));
// This text is at the bottom left corner RIGHT SIDE UP
// cg context is a CGBitmapContext
CGContextShowTextAtPoint(
    cgcontext, 
    0, 0, 
    str.c_str(), 
    str.length());

// Send final image to video output.
CGImageRef screenImage = CGBitmapContextCreateImage(cgcontext);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0, 480);
// Here I flip the whole image, so if I flip the text above, then
// it ends up upside down.
CGContextScaleCTM(context, 1, -1); 
CGContextDrawImage(context, 
    CGRectMake(0, 0, 320, 480), screenImage);
CGContextRestoreGState(context);

CGImageRelease(screenImage);

我该如何混合坐标系?如何在以ULC原点为基础的坐标系中将文本正向显示?

1个回答

1

翻转坐标系意味着你会倒置绘图。如果没有这个结果,你就无法进行这种转换。(这样做的原因是当你要将结果交给某些东西来翻转它时,倒置的部分将再次变为正面朝上。)

所有的东西总是以正向y轴向上和负向y轴向下绘制。文本向正向y轴上升,向负向y轴下降到基线以下。连续行的基线位置越来越低。图像和(非文本)路径也是如此——所有东西都是这样绘制的。

通过转换坐标系所做的事情并不改变绘制方式;它们总是以正向y轴向上绘制。转换坐标系是重新定义上下方向。你将正向y轴变成负向y轴,反之亦然。你还改变了0,0的位置。

因此,你需要做的不是翻转坐标系,而是(仅仅)平移它。你需要将整个上下文的高度减去一行文本的高度,然后向上平移。然后,以该位置定义0,0,你可以在0,0处显示你的文本,它将从该位置开始绘制,而且是正确的方向(上下)。

或者,不翻译,只需从该点显示文本。任何一种方式都可以。

我相信您不需要也不希望在目标上下文中进行任何转换。翻译(如果您选择翻译)应该在位图上下文中进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接