繁体   English   中英

如何在 Qt 6 中将 CGImageRef 转换为 QPixmap?

[英]How to convert a CGImageRef to a QPixmap in Qt 6?

在 Qt 5 中,使用他们的QtMacExtras模块和QtMac::fromCGImageRef function 可以轻松地将CGImageRef转换为QPixmap

在Qt 6, QtMacExtras已经被移除。 那里的大多数函数都有明确的替换,除了QtMac::fromCGImageRef被删除“由于缺少已知的 API 客户端”。

好吧,事实证明我是那个 API 的客户,只是不为人所知。 N.netheless,现在我需要在 Qt 6 中将CGImageRef转换为QPixmap

我查看了 Qt 5.15.2 中QtMac::fromCGImageRef的源代码,它引导我找到一个名为qt_mac_toQImage 但是,它使用了大量我在 Qt 5 中无法访问的内部函数和类,更不用说 Qt 6 了,所以这无济于事。

我怎样才能go做这个转换呢?

事实证明,qt_mac_toQImage 的 Qt 5.15 实现中使用的许多私有qt_mac_toQImage内容适用于除了尝试对 QImage 进行 CoreGraphics 渲染之外的情况。 将所有这些部分取出并简化后,将 CGImageRef 转换为 QImage 或 QPixmap 的方法就相当简单了:

CGBitmapInfo CGBitmapInfoForQImage(const QImage &image)
{
    CGBitmapInfo bitmapInfo = kCGImageAlphaNone;
    
    switch (image.format()) {
        case QImage::Format_ARGB32:
            bitmapInfo = kCGImageAlphaFirst | kCGBitmapByteOrder32Host;
            break;
        case QImage::Format_RGB32:
            bitmapInfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host;
            break;
        case QImage::Format_RGBA8888_Premultiplied:
            bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big;
            break;
        case QImage::Format_RGBA8888:
            bitmapInfo = kCGImageAlphaLast | kCGBitmapByteOrder32Big;
            break;
        case QImage::Format_RGBX8888:
            bitmapInfo = kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big;
            break;
        case QImage::Format_ARGB32_Premultiplied:
            bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host;
            break;
        default:
            break;
    }
    
    return bitmapInfo;
}

QImage CGImageToQImage(CGImageRef cgImage)
{
    const size_t width = CGImageGetWidth(cgImage);
    const size_t height = CGImageGetHeight(cgImage);
    QImage image(width, height, QImage::Format_ARGB32_Premultiplied);
    image.fill(Qt::transparent);
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
    CGContextRef context = CGBitmapContextCreate((void *)image.bits(), image.width(), image.height(), 8,
                                                 image.bytesPerLine(), colorSpace, CGBitmapInfoForQImage(image));

    // Scale the context so that painting happens in device-independent pixels
    const qreal devicePixelRatio = image.devicePixelRatio();
    CGContextScaleCTM(context, devicePixelRatio, devicePixelRatio);
    
    CGRect rect = CGRectMake(0, 0, width, height);
    CGContextDrawImage(context, rect, cgImage);
    
    CFRelease(colorSpace);
    CFRelease(context);
    
    return image;
}

CGImageRef转换为QImage后,使用QPixmap::convertFromImage将其转换为QPixmap很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM