Нарисуйте текст в CGBitmapContext

У меня есть приложение, которое преобразует UIView в CGContext в drawRect. Я также экспортирую эти рендеры с помощью фонового рендерера. Он использует ту же логику рендеринга для рендеринга (быстрее, чем в реальном времени) в CGBitmapContext (который я впоследствии преобразую в файл mp4).

Я заметил, что выходное видео имеет ряд странных сбоев. Например, вращающееся изображение, странные дубликаты визуализированных изображений, случайный шум и нечетное время.

Я ищу способы отладить это. Что касается проблемы с синхронизацией, я подумал, что буду отображать строку, которая сообщает мне, какой кадр я просматриваю в данный момент, только для того, чтобы обнаружить, что рендеринг текста в CGContext не очень хорошо документирован. На самом деле, документация по большей части основной графики довольно неумолима для некоторых из моего опыта.

В частности, я хотел бы знать, как отображать текст в контексте. Если это основной текст, должен ли он как-то взаимодействовать с основным графическим контекстом? И вообще, я был бы признателен за любые советы и рекомендации по рендерингу растровых изображений и отладке результатов.


person Alex Bollbach    schedule 19.04.2018    source источник


Ответы (1)


по другому вопросу: Как преобразовать текст в изображение в какао Цель-C

мы можем использовать CTLineDraw для рисования текста в примере кода CGBitmapContext:

NSString* string = @"terry.wang";
CGFloat fontSize = 10.0f;
// Create an attributed string with string and font information
CTFontRef font = CTFontCreateWithName(CFSTR("Helvetica Light"), fontSize, nil);
NSDictionary* attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            (id)font, kCTFontAttributeName, 
                            nil];
NSAttributedString* as = [[NSAttributedString alloc] initWithString:string attributes:attributes];
CFRelease(font);

// Figure out how big an image we need 
CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef)as);
CGFloat ascent, descent, leading;
double fWidth = CTLineGetTypographicBounds(line, &ascent, &descent, &leading);

// On iOS 4.0 and Mac OS X v10.6 you can pass null for data 
size_t width = (size_t)ceilf(fWidth);
size_t height = (size_t)ceilf(ascent + descent);
void* data = malloc(width*height*4);

// Create the context and fill it with white background
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast;
CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width*4, space, bitmapInfo);
CGColorSpaceRelease(space);
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0); // white background
CGContextFillRect(ctx, CGRectMake(0.0, 0.0, width, height));

// Draw the text 
CGFloat x = 0.0;
CGFloat y = descent;
CGContextSetTextPosition(ctx, x, y);
CTLineDraw(line, ctx);
CFRelease(line);
person W.Terry    schedule 22.02.2019