Работает ли CGContextSetTextMatrix для внеэкранных растровых изображений?

Я создаю изображение за кадром, используя контекст из CGBitmapContextCreate().

При рисовании текста я пытался использовать:

CGContextSetTextMatrix(contextRef, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));

но мой текст все еще был вверх ногами. Если бы я использовал стандартные преобразования, это было бы правильно:

CGContextTranslateCTM(contextRef, 0.0, contextRect.size.height);
CGContextScaleCTM(contextRef, 1.0, -1.0);

Мой вопрос: должен ли CGContextSetTextMatrix работать с растровым изображением за кадром? Может быть, я делал что-то не так.


person cmar    schedule 09.08.2010    source источник


Ответы (2)


Нет. Текстовая матрица, как следует из ее названия, влияет только на текст.

Весь рисунок проходит через текущую матрицу трансформации, и только текст тоже проходит через текстовую матрицу. Итак, для всего, что не является текстом, вам нужно изменить CTM.

Вы можете использовать функцию CGContextConcatCTM, чтобы объединить свою флип-матрицу с CTM в одном вызове функции, хотя мне было бы легче читать преобразование + масштабирование. Обратите внимание, что объединение одной матрицы с другой — это не то же самое, что замена старой матрицы новой.

В Core Graphics нет функции замены CTM другой матрицей; вы можете только объединиться с ним. Вы можете получить CTM, инвертировать ее и объединить обратную матрицу с текущей матрицей, чтобы вернуться к единичной матрице; затем объединение желаемой матрицы с ней приведет к тому, что матрица будет вашей желаемой матрицей без каких-либо других влияний. Тем не менее, нет особых причин прилагать все эти усилия.

person Peter Hosey    schedule 09.08.2010
comment
Петр, спасибо за ответ, но я запутался. Я рисую текст в закадровом растровом изображении, так что не должен ли он отображаться правильно, если я устанавливаю CGContextSetTextMatrix? Я попытался объяснить выше, что, хотя я устанавливал матрицу, изображение, которое я извлекал из контекста растрового изображения, имеет текст вверх ногами. Если я рисую прямо на экране, используя CGContextSetTextMatrix, мой текст правильный, но кажется, что CGContextSetTextMatrix не работает для моего внеэкранного растрового изображения. Но я не верю, что это правда. - person cmar; 10.08.2010
comment
О, извините, я неправильно прочитал. Текстовая матрица всегда должна работать, независимо от того, в каком контексте вы рисуете. Не могли бы вы показать больше кода в своем вопросе, пожалуйста? - person Peter Hosey; 11.08.2010

Я столкнулся с той же проблемой и решил, используя:

CGContextTranslateCTM(context, 0.0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
......
CGGlyph glyphs[text.length];
CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)(fontName), fontSize, NULL);
CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[text cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, text.length);
CGContextShowGlyphsAtPoint(context, destX, destY, (const CGGlyph *)glyphs, ce.text.length);

Просто к вашему сведению.

person Nianliang    schedule 01.01.2013