如何将内存图像数据封装成QImage

当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。

在内存中,8bit灰度图像的宽度有可能不能满足BMP格式需求(为4的倍数),在封装成8bit灰度QImage时,会遇到封装不完整或错误的问题。本人总结了该问题,写了一个封装内存8bit灰度图像数据的C++类。

首先看代码部分:

//BufferToQImage.h

/*
* Copyright (c) 2013,中科院苏州医工所
* All rights reserved.
*
* 文件名称:BufferToQImage.h
* 文件标识:见配置管理计划书
* 摘 要:将内存数据封装成QImage。
*
* 当前版本:1.0
* 作 者:LYC
* 完成日期:2013年6月27日
*/ #ifndef BUFFERTOQIMAGE_H
#define BUFFERTOQIMAGE_H #include <QImage>
#include <Windows.h>
#include <assert.h>
#include <QVector> class BufferToQImage
{
public:
BufferToQImage(void);
~BufferToQImage(void); public:
QImage Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight); //将8bit灰度数据封装成QImage private:
QVector<QRgb> vcolorTable; //生成灰度颜色表 }; #endif

//BufferToQImage.cpp

/*
* Copyright (c) 2013,中科院苏州医工所
* All rights reserved.
*
* 文件名称:BufferToQImage.h
* 文件标识:见配置管理计划书
* 摘 要:将内存数据封装成QImage。
*
* 当前版本:1.0
* 作 者:LYC
* 完成日期:2013年6月27日
*/ #include "BufferToQImage.h" BufferToQImage::BufferToQImage(void)
{
for (int i = 0; i < 256; i++)
{
vcolorTable.append(qRgb(i, i, i));
}
} BufferToQImage::~BufferToQImage(void)
{ } /*
* 函数名:Pk8bitGrayToQIm()
* 功能:将8bit灰度数据封装成QImage
* 参数:
* pBuffer - 内存数据指针
* bufWidth - 内存数据宽度
* bufHight - 内存数据高度
* 返回值:QImage
* 作者:LYC
* 时间:2013.6.27
*/
QImage BufferToQImage::Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight)
{
//对参数的有效性进行检查
assert((pBuffer != NULL) && (bufWidth>0) && (bufHight>0)); int biBitCount = 8; //灰度图像像素bit数
int lineByte = (bufWidth * biBitCount/8 + 3) / 4 * 4; //bmp行byte数(格式宽度,为4的倍数) if (bufWidth == lineByte) //判断图像宽度与格式宽度
{
QImage qIm = QImage(pBuffer, bufWidth, bufHight, QImage::Format_Indexed8); //封装QImage
qIm.setColorTable(vcolorTable); //设置颜色表 return qIm;
}
else
{
BYTE *qImageBuffer = new BYTE[lineByte * bufHight]; //分配内存空间
uchar *QImagePtr = qImageBuffer; for (int i = 0; i < bufHight; i++) //Copy line by line
{
memcpy(QImagePtr, pBuffer, bufWidth);
QImagePtr += lineByte;
pBuffer += bufWidth;
} QImage qImage = QImage(qImageBuffer, bufWidth, bufHight, QImage::Format_Indexed8); //封装QImage
qImage.setColorTable(vcolorTable); //设置颜色表 return qImage;
}
}

利用我的博客中《任意宽度灰度BMP图像读写 V2》的程序,可以读取任意宽度的图像,选择能够返回有效图像数据的成员函数,可以模拟相机写入内存中的数据。我利用rd8BitBmpNtFmt()读取78*86的图像,利用上述成员函数将内存的图像数据封装成QImage,并原尺寸显示和512*512放大显示,效果如下:

最新文章

  1. GSM07.10协议中串口复用的注意事项
  2. Eclipse 代码格式:“{ }”的格式设置
  3. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
  4. Springfox Reference Documentation
  5. C#(一维数组)
  6. JavaEE通过response实现请求重定向
  7. Android(java)学习笔记104:Map集合的遍历之键找值
  8. Linux学习--进程创建
  9. jquery 点击事件切换样式
  10. SQL 约束 (Constraints)
  11. ORA错误总结
  12. PHP 服务器及TP5框架遇到的几个错误
  13. http与https的区别以及https如何保证数据传输安全
  14. lesson5rnns-fastai
  15. sas 基础(1)-关于数据格式的SAS函数
  16. 【转】[MySQL复制异常]Cannot execute statement: impossible to write to binary log since statement is in row for
  17. STS-创建spring配置文件
  18. 【LOJ】#2887. 「APIO2015」雅加达的摩天楼 Jakarta Skyscrapers
  19. Jack--10天学会IOS大纲;注意将图片放大观看!
  20. 使用getid3获取音频文件信息

热门文章

  1. C#基础知识之图解TCP IP》读书笔记
  2. mapper映射文件配置之select、resultMap(转载)
  3. 九、爬虫框架之Scrapy
  4. 玩蛇记之用python实现易宝快速支付接口
  5. C++ fstream 用法
  6. 读取xml文件中的配置参数实例_java - JAVA
  7. Python 变量类型 Ⅱ
  8. 模板_SPLAY
  9. React 项目中修改 Ant Design 的默认样式(Input Checkbox 等等
  10. 从源码编译安装PCL并运行第一个小例子