Перевернутый рисунок NSString в CGContext - PullRequest
3 голосов
/ 10 августа 2009

Я пытаюсь нарисовать строку в этой текстуре:

http://picasaweb.google.it/lh/photo/LkYWBv_S_9v2d6BAfbrhag?feat=directlink

но зеленые цифры кажутся перевернутыми по вертикали. Я создал свой контекст следующим образом:

    colorSpace = CGColorSpaceCreateDeviceRGB();
data = malloc(height * width * 4);
context = CGBitmapContextCreate(data, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

и я нарисовал строки:

    UIGraphicsPushContext(context);

for(int i=0;i<packs.size();++i)
{
    CGPoint points[4] = 
    {
        gltextures[i].texCoords[0] * size.width,        //0
        gltextures[i].texCoords[1] * size.height,       //1

        gltextures[i].texCoords[2] * size.width,        //2
        gltextures[i].texCoords[3] * size.height,       //3

        gltextures[i].texCoords[4] * size.width,        //4
        gltextures[i].texCoords[5] * size.height,       //5

        gltextures[i].texCoords[6] * size.width,        //6
        gltextures[i].texCoords[7] * size.height        //7

    };

    CGRect debugRect = CGRectMake
    (
     gltextures[i].texCoords[0] * size.width, 
     gltextures[i].texCoords[1] * size.height, 
     gltextures[i].width, 
     gltextures[i].height
     );
    CGContextSetStrokeColorWithColor(context, [[UIColor redColor] CGColor]);
    CGContextAddLines(context, points, 4);
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathStroke);  

    NSString* s = [NSString stringWithFormat:@"%d",gltextures[i].texID];
    UIFont* font = [UIFont fontWithName:@"Arial" size:12];
    CGContextSetRGBFillColor(context, 0, 1, 0, 1);
    [s drawAtPoint:points[0] withFont:font];
}
UIGraphicsPopContext();

Матрица преобразования выглядит как матрица идентичности ... в этом контексте CGAffineTransform не применяется Если строка перевернута, возможно, все мои изображения перевернуты! Любое предложение?

PS: простите за мой английский;)

Ответы [ 2 ]

7 голосов
/ 10 августа 2009

Как описано здесь , система координат для контекста в пределах UIView или его слоя инвертируется по сравнению с обычным пространством рисования Кварца. Однако при использовании Quartz для рисования изображения это уже не так. Категория UIStringDrawing Cocoa Touch на NSString, которая предоставляет метод -drawAtPoint: withFont: предполагает перевернутый макет, и поэтому вы видите перевернутый текст на изображении.

Один из способов обойти это - сохранить графическое состояние, применить инвертированное преобразование к изображению, нарисовать текст и восстановить старое графическое состояние. Это будет выглядеть примерно так:

CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0f, self.bounds.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);

[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:font];

CGContextRestoreGState(context);

Это довольно грубый пример, так как я считаю, что он просто рисует текст внизу изображения, но вы должны быть в состоянии отрегулировать перевод или координату текста, чтобы разместить его там, где это необходимо.

2 голосов
/ 01 июля 2012

Лучше сохранить матрицу текста перед прорисовкой, иначе это повлияет на прорисовку другого текста с помощью CoreGraphic:

CGContextSaveGState(ctx);
CGAffineTransform save = CGContextGetTextMatrix(ctx);
CGContextTranslateCTM(ctx, 0.0f, self.bounds.size.height);
CGContextScaleCTM(ctx, 1.0f, -1.0f);
[str drawAtPoint:point withFont:font];
CGContextSetTextMatrix(ctx, save);
CGContextRestoreGState(ctx);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...