通过浏览器下发图像到设备(二)Qt实现下发图像复原

同系列文章:

用户通过浏览器将图像数据上传到服务器,然后由服务器下发到嵌入式设备。设备只能显示16位Bitmap图像。
下面为在设备端基于Qt实现的下发图像复原:

/* ----------------------------------------------------------
 * 文件名称:BitmapUtil.cpp
 *
 * 作者:秦建辉
 *
 * MSN:splashcn@msn.com
 * QQ:36748897
 *
 * 博客:http://www.firstsolver.com/wordpress/
 *
 * 开发环境:
 *      Qt Creator 2.4.1
 *
 * 版本历史:
 *
 *      V1.0	2012年07月31日
 *              从16位图像的Base64编码字符串复原图像
------------------------------------------------------------ */
#include <QString>
#include <QByteArray>
#include <QImage>

// 从Bgr565图像的Base64编码字符串复原图像
QImage* ImageFromBgr565Base64String(int width, int height, const QString& base64String, bool isBigEndian = false)
{
    QByteArray Data = QByteArray::fromBase64(base64String.toAscii());
    if(Data.length() != ((width * height) << 1))
    {   // 图像不符合大小要求
        return NULL;
    }

    QImage* Image = new QImage(width, height, QImage::Format_RGB16);
    int Index = 0;
    for(int y = 0; y < height; y++)
    {
        for(int x = 0; x < width; x++)
        {
            uchar b1 = Data[Index++];
            uchar b2 = Data[Index++];

            if(isBigEndian)
            {
                uint Color = (((b1 >> 3) & 0x1f) << 19) + ((b1 & 7) << 13) + (((b2 >> 5) & 7) << 10) + ((b2 & 0x1f) << 3);
                Image->setPixel(x, y, Color);
            }
            else
            {
                uint Color = (((b2 >> 3) & 0x1f) << 19) + ((b2 & 7) << 13) + (((b1 >> 5) & 7) << 10) + ((b1 & 0x1f) << 3);
                Image->setPixel(x, y, Color);
            }
        }
    }

    return Image;
}

// 从Bgr555图像的Base64编码字符串复原图像
QImage* ImageFromBgr555Base64String(int width, int height, const QString& base64String, bool isBigEndian = false)
{
    QByteArray Data = QByteArray::fromBase64(base64String.toAscii());
    if(Data.length() != ((width * height) << 1))
    {   // 图像不符合大小要求
        return NULL;
    }

    QImage* Image = new QImage(width, height, QImage::Format_RGB555);
    int Index = 0;
    for(int y = 0; y < height; y++)
    {
        for(int x = 0; x < width; x++)
        {
            uchar b1 = Data[Index++];
            uchar b2 = Data[Index++];

            if(isBigEndian)
            {
                uint Color = (((b1 >> 2) & 0x1f) << 19) + ((b1 & 3) << 14) + (((b2 >> 5) & 7) << 11) + ((b2 & 0x1f) << 3);
                Image->setPixel(x, y, Color);
            }
            else
            {
                uint Color = (((b2 >> 2) & 0x1f) << 19) + ((b2 & 3) << 14) + (((b1 >> 5) & 7) << 11) + ((b1 & 0x1f) << 3);
                Image->setPixel(x, y, Color);
            }
        }
    }

    return Image;
}

Comments are closed.