3

所以我正在使用 CGBitmapContext 使软件 blitter 适应 iOS。我将数据写入位图,然后使用 CoreGraphics 函数在 CGBitmapContext 上写入文本。软件 blitter 使用左上原点,而 CoreGraphics 函数使用左下原点。因此,当我使用 (0, 0) 处的 blitter 绘制图像时,它会出现在左上角。当我在 (0, 0) 处使用 CG 绘制文本时,它出现在左下角,并且未反转。是的,我已经阅读了有关反转坐标的所有其他问题,并且我正在对生成的 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 原点将文本正面朝上绘制?

4

1 回答 1

1

翻转坐标系意味着您将颠倒绘制。没有这个结果,你就无法进行这种转变。(这样做的原因是当您将结果交给可以将其翻转回来的东西时,因此颠倒将再次成为正面向上。)

一切总是以正 y 上升和负 y 下降来绘制。文本向正 y 上升,并在基线以下向负 y 下降。连续行的基线具有越来越低的 y 位置。图像和(非文本)路径也是如此——一切都以这种方式绘制。

您通过转换坐标系所做的不是改变事物的绘制方式;他们总是以正y向上绘制。变换坐标系就是重新定义 up 和 down。您将正 y 变为负 y,反之亦然。您还可以更改 0, 0 的位置。

所以你需要做的不是翻转坐标系,而是(仅)翻译它。您需要向上翻译上下文的整个高度,减去一行文本的高度。然后,将 0,0 定义为该位置,您可以在 0,0 处显示您的文本,它将从该位置绘制,并以正确的方式向上(和向下)。

或者,不要翻译,只显示该点的文本。无论哪种方式都会奏效。

我很确定您不需要也不想在目标上下文中进行任何转换。翻译(如果你翻译的话)应该发生在位图上下文中。

于 2011-02-20T05:16:27.513 回答