【问题标题】:CGFontGetGlyphBBoxes wrong resultCGFontGetGlyphBBoxes 错误结果
【发布时间】:2018-05-16 16:16:38
【问题描述】:

我一直在尝试精确测量字形边界,但此代码打印出 916!!!它的实际宽度是 69。

- (void)drawRect:(NSRect)dirtyRect {
        CGContextRef main = [[NSGraphicsContext currentContext] graphicsPort];
        CGContextSetTextMatrix(main, CGAffineTransformIdentity);
        CGGlyph g;
        CGPoint p  = CGPointMake(100, 100);
        CGRect rect = CGRectMake(0, 0, 0, 0);
        CGFontRef font = CGFontCreateWithFontName((CFStringRef)@"Arial");
        g = CGFontGetGlyphWithGlyphName(font, CFSTR("L"));
        CGContextSetFont(main, font);
        CGContextSetTextPosition(main, 0, 0);
        CGContextSetFontSize(main, 200);
        CGContextSetRGBFillColor(main, 0, 0, 1, 1);
        CGContextShowGlyphsAtPositions(main, &g, &p, 1);
        CGFontGetGlyphBBoxes(font, &g, 1, &rect);
        printf("%f", rect.size.width);
    }

【问题讨论】:

  • 真正想做什么? TextKit 可能会更容易做到这一点。
  • 因为我想渲染单个字形并快速更改它们
  • 这没什么好解释的。这里发生了什么是 TextKit 甚至 NSString 都做不到的?
  • 如果您的性能需求如此紧张以至于基本的NSString 绘图无法满足您的要求,那么您可以接受每次使用相同字体调用CGFontCreateWithFontName 的绘图方法似乎很奇怪。上面的代码真的比[NSString drawAtPoint:withAttributes:] 快​​很多吗(具有一组静态定义的属性,因此您不必每次都重新计算字体对象?)或者您真的需要像连字这样的字形? (也许您当前的示例具有误导性,因为它使用“L?”)(不要减损 LGP 的答案,我敢肯定这是您需要的。)
  • 这只是我自己测试的简单示例

标签: objective-c cocoa core-graphics core-text


【解决方案1】:

您正在使用CGFontGetGlyphBBoxes,它以字形空间单位返回大小。要使用它,您需要使用每 em 的单位和字体大小对其进行缩放。

CGRect rect;
CGFontRef font = CGFontCreateWithFontName((CFStringRef)@"Arial");
CGFloat fontSize = 200.0;
CGGlyph g = CGFontGetGlyphWithGlyphName(font, CFSTR("L"));
CGFontGetGlyphBBoxes(font, &g, 1, &rect);
CGFloat width = rect.size.Width / CGFontGetUnitsPerEm(font) * fontSize;

另一种方法是使用[NSFont boundingRectForCGGlyph:]

NSFont *font = [NSFont fontWithName:@"Arial" size:200];
NSRect rect = [font boundingRectForCGGlyph:g];

boundingRectForCGGlyph
返回指定字形的边界矩形,缩放到接收器的大小。

【讨论】:

  • 所以我需要除以 CGFontGetUnitsPerEm?
  • 是的,乘以字体大小。 CGFloat width = glyphWidth / CGFontGetUnitsPerEm(font) * 200.0;
  • 另外,如果需要,不要忘记四舍五入到最近的像素。 :)
猜你喜欢
  • 2022-10-21
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2018-08-27
  • 2014-02-18
相关资源
最近更新 更多