Mac写入文字的像素宽度

参考文档:

https://en.wikipedia.org/wiki/Core_Text

https://developer.apple.com/library/content/documentation/TextFonts/Conceptual/CocoaTextArchitecture/FontHandling/FontHandling.html#//apple_ref/doc/uid/TP40009459-CH5-SW18

https://developer.apple.com/library/content/documentation/TextFonts/Conceptual/CocoaTextArchitecture/TypoFeatures/TextSystemFeatures.html#//apple_ref/doc/uid/TP40009459-CH6-51627-BBCCHIFF

https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005533 

#include <iostream>
#include <string>
#include <CoreText/CoreText.h>
#include <CoreFoundation/CFBase.h>
#include <iomanip>

void GetTextExtent(const std::wstring fontname, int fontsize, const std::wstring str, float* width, float* height) {
    if (str.empty())
    {
        *width = 0;
        *height = 0;
        return;
    }

    CFStringRef nameRef = CFStringCreateWithBytes(kCFAllocatorDefault,
                                                 reinterpret_cast<const UInt8*>(fontname.c_str()),
                                                 fontname.size() * sizeof(wchar_t),
                                                 kCFStringEncodingUTF32LE,
                                                 false);
    
    CTFontRef fontRef = CTFontCreateWithName(nameRef, fontsize, 0);

    CFStringRef strRef = CFStringCreateWithBytes(kCFAllocatorDefault,
                                              reinterpret_cast<const UInt8*>(str.c_str()),
                                              str.size() * sizeof(wchar_t),
                                              kCFStringEncodingUTF32LE,
                                              false);
    
    CFStringRef keys[] = { kCTFontAttributeName };
    CFTypeRef values[] = { fontRef };
    CFDictionaryRef font_attributes = CFDictionaryCreate(0, (const void **)keys, (const void **)values, sizeof(keys)/sizeof(keys[0]),
                                                         &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFAttributedStringRef attrStr = CFAttributedStringCreate(0, strRef, font_attributes);
    CTLineRef line = CTLineCreateWithAttributedString(attrStr);
    CGFloat a, d, l, w;
    w = CTLineGetTypographicBounds(line, &a, &d, &l);
    
    
    if (width)
        *width = w;
    if (height)
        *height = a + d + l;

    CFRelease(nameRef);
    CFRelease(strRef);
    CFRelease(fontRef);
}


void GetTextExtent2(const std::wstring fontname, int fontsize, const std::wstring str, float* width, float* height) {
    if (str.empty())
    {
        *width = 0;
        *height = 0;
        return;
    }
    
    CFStringRef strRef = CFStringCreateWithBytes(kCFAllocatorDefault,
                                              reinterpret_cast<const UInt8*>(str.c_str()),
                                              str.size() * sizeof(wchar_t),
                                              kCFStringEncodingUTF32LE,
                                              false);
    
    CFStringRef nameRef = CFStringCreateWithBytes(kCFAllocatorDefault,
                                                  reinterpret_cast<const UInt8*>(fontname.c_str()),
                                                  fontname.size() * sizeof(wchar_t),
                                                  kCFStringEncodingUTF32LE,
                                                  false);
    
    CTFontRef fontRef = CTFontCreateWithName(nameRef, fontsize, 0);
    
    CFIndex count = CFStringGetLength(strRef);
    
    UniChar *characters = (UniChar *)malloc(sizeof(UniChar) * count);
    CGGlyph *glyphs = (CGGlyph *)malloc(sizeof(CGGlyph) * count);
    
    CFStringGetCharacters(strRef, CFRangeMake(0, count), characters);
    CTFontGetGlyphsForCharacters(fontRef, characters, glyphs, count);
    
    CGSize *sizeCore = (CGSize*)malloc(count * sizeof(CGSize));
    
    double adv = CTFontGetAdvancesForGlyphs (fontRef,
                                             kCTFontOrientationHorizontal,
                                             glyphs,
                                             sizeCore,
                                             count);
    *width = adv;
    *height = sizeCore->height;
    
    CFRelease(strRef);
    CFRelease(nameRef);
    CFRelease(fontRef);
    free(characters);
    free(glyphs);
    free(sizeCore);
}

void GetTextExtent3(const std::wstring fontname, int fontsize, const std::wstring str, float* width, float* height) {
    if (str.empty())
    {
        *width = 0;
        *height = 0;
        return;
    }
    
    CFStringRef strRef = CFStringCreateWithBytes(kCFAllocatorDefault,
                                                 reinterpret_cast<const UInt8*>(str.c_str()),
                                                 str.size() * sizeof(wchar_t),
                                                 kCFStringEncodingUTF32LE,
                                                 false);
    
    CFStringRef nameRef = CFStringCreateWithBytes(kCFAllocatorDefault,
                                                  reinterpret_cast<const UInt8*>(fontname.c_str()),
                                                  fontname.size() * sizeof(wchar_t),
                                                  kCFStringEncodingUTF32LE,
                                                  false);
    
    CTFontRef fontRef = CTFontCreateWithName(nameRef, fontsize, 0);
    CFIndex count = CFStringGetLength(strRef);
    UniChar *characters = (UniChar *)malloc(sizeof(UniChar) * count);
    CGGlyph *glyphs = (CGGlyph *)malloc(sizeof(CGGlyph) * count);
    
    CFStringGetCharacters(strRef, CFRangeMake(0, count), characters);
    CTFontGetGlyphsForCharacters(fontRef, characters, glyphs, count);
    
    CGSize *sizeCore = (CGSize*)malloc(count * sizeof(CGSize));
    CGRect *rectCore = (CGRect*)malloc(count * sizeof(CGRect));
    
    double adv = CTFontGetAdvancesForGlyphs (fontRef,
                                             kCTFontOrientationHorizontal,
                                             glyphs,
                                             sizeCore,
                                             count);
    // rect 是第一个字符的宽度
    CGRect rect = CTFontGetBoundingRectsForGlyphs (fontRef,
                                                   kCTFontOrientationHorizontal,
                                                   glyphs,
                                                   rectCore,
                                                   count);
    double kerning = adv - rect.size.width;
    std::cout << "return CGRect.size.width : " << ((CGRect*)rectCore)->size.width << std::endl;
    std::cout << "CGRect : ";
    float sumwidth = 0.f;
    
    for (int i = 0; i < count; ++i) {
        sumwidth += rect.size.width;
        std::cout << " " << i << " : " << rect.size.width;
    }
    std::cout << std::endl;
    
    std::wcout << str << "\tsum    : " << sumwidth << std::endl;
    std::wcout << str << "\tadv    : " << adv << std::endl;
    std::wcout << str << "\tkerning: " << kerning << std::endl;
    
    free(characters);
    free(glyphs);
    free(sizeCore);
    free(rectCore);
}

typedef void (*func)(const std::wstring fontname, int fontsize, const std::wstring str, float* width, float* height);

void test1(func f) {
    std::wstring fontname = L"Arial";
    int fontsize = 16;
    std::wstring str;
    for (wchar_t wc = 'A'; wc < 'z'; ++wc ) {
        str.append(&wc , 1);

        float w, h;
        f(fontname, fontsize, str, &w, &h);
        std::wcout << str << "\t" << fontname << "\t" << fontsize << "\t" << std::setw(10) << w << "\t" << h << "\t"  << std::endl;
    }
}

void test2(func f) {
    std::wstring fontname = L"Arial";
    int fontsize = 16;
    for (wchar_t wc = 'A'; wc < 'z'; ++wc ) {
        std::wstring str;
        str.append(&wc , 1);
        
        float w, h;
        f(fontname, fontsize, str, &w, &h);
        std::wcout << str << "\t" << fontname << "\t" << fontsize << "\t" << std::setw(10) << w << "\t" << h << "\t"  << std::endl;
    }
}

 

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值