C

图像解码器集成

概述

对于以 Qt Quick Ultralite 所不熟悉的自定义格式存储的图像资产,图像解码器提供了一个易于实现的 API,允许对这些图像进行解码。Qt Quick Ultralite 引擎会根据图像格式自动选择正确的解码器。

可以从 SD 卡加载图像,而不需要预处理,甚至不需要在项目中声明它。无论资产存储在闪存还是 SD 卡上,都只需要实现一个 API。

自定义图像解码器在需要将资产保持在特定于你的使用案例的格式时非常有用。解码完全由实现者控制,可以利用设备上可用的任何硬件加速。

为了加载任意图像格式,图像解码器实现必须在初始化阶段与应用程序注册。无论何时要显示来自资源或磁盘(file://)的图像,Qt Quick Ultralite 将检查是否具有内置的资产格式。如果没有,将按注册顺序使用所有已注册的图像解码器来解码图像。如果资源中有可解码的图像,必须在调用 Qul::initPlatform() 之前注册解码器。

为 Qt Quick Ultralite 实现图像解码器

自定义图像解码器必须实现 Qul::PlatformInterface::ImageDecoder 类。在 imagedecoder 中可以找到用于加速硬件 JPEG 解码器的示例实现。

以下代码显示了该类的示例实现

class MyDecoder : public Qul::PlatformInterface::ImageDecoder
{
public:
    bool imageInformation(RequestDataCallback &callback,
                          int16_t *width,
                          int16_t *height,
                          Qul::PixelFormat *actualPixelFormat,
                          Qul::PixelFormat optimalOpaquePixelFormat,
                          Qul::PixelFormat optimalAlphaPixelFormat);
    int decodeImage(RequestDataCallback &callback,
                    unsigned char *outbuffer,
                    uint32_t outbufferSize,
                    Qul::PixelFormat pixelFormat,
                    uint32_t requiredBytesPerLine);
}
bool MyDecoder::imageInformation(RequestDataCallback &callback,
                                 int16_t *width,
                                 int16_t *height,
                                 Qul::PixelFormat *actualPixelFormat,
                                 Qul::PixelFormat optimalOpaquePixelFormat,
                                 Qul::PixelFormat optimalAlphaPixelFormat)
{
    unsigned char buffer[1024];
    uint32_t offset 0; // Start from beginning of the file

    callback.read(buffer, offset, 8)

    // Check if this decoder is able to decode the image
    if (buffer[0] != 0x89 || buffer[1] != 0x50 … ) { // PNG format header: 89 50 4E 47 0D 0A 1A 0A
        return false; // Return early when the format is unknown
    }

    // Read more data from the image to determine the size and pixel format.
    callback.read(buffer, offset, sizeof(buffer))
    *width = getImageWidth(buffer);
    *height = getImageHeight(buffer);
    *actualPixelFormat = getOptimalImageFormat(buffer, optimalOpaquePixelFormat, optimalAlphaPixelFormat);

    return true;
}
int MyDecoder::decodeImage(RequestDataCallback &callback,
                           unsigned char *outbuffer,
                           uint32_t outbufferSize,
                           Qul::PixelFormat pixelFormat,
                           uint32_t requiredBytesPerLine)
{
    unsigned char *allocatedBuffer = NULL;

    allocatedBuffer = callback.rawData();
    if (!allocatedBuffer) {
        // The data is not in addressable memory and might need to be fetched
        uint32_t bufferSize = callback.totalAvailableDataSize();
        allocatedBuffer = (unsigned char *) Qul::Platform::qul_malloc(bufferSize);
        callback.readData(allocatedBuffer, 0, bufferSize);
    }

    hardware_decode(allocatedBuffer, bufferSize, outbuffer, outbufferSize);
    Qul::Platform::qul_free(allocatedBuffer);

    return 0;
}

要使实现的图像解码器对 Qt Quick Ultralite 可知,必须将其与应用程序注册。

static MyDecoder decoder;
Qul::Application::addImageDecoder(&decoder);

在特定的 Qt 许可证下可用。
了解更多信息。