如何将内存图像数据封装成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放大显示,效果如下:

【Qt开发】将内存图像数据封装成QImage V2的更多相关文章

  1. 将内存图像数据封装成QImage V2

    转:http://www.cnblogs.com/bibei1234/p/3161555.html 如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行 ...

  2. 【Qt开发】如何将内存图像数据封装成QImage V1

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

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

    http://blog.csdn.net/lyc_daniel/article/details/9055787 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放.旋转)操作. ...

  4. 将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  5. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  6. Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转

    Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...

  7. 【Qt开发】Qt中图像的显示与基本操作

    Qt可显示基本的图像类型,利用QImage.QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放.旋转). 1. Qt可显示的图像类型 参考Qt的帮助文档,可支持的类型,即 ...

  8. 使用 Qt 获取 UDP 数据并显示成图片(2)

    本文首发于 BriFuture 的 个人博客 在我的前一篇文章 使用 Qt 获取 UDP 数据并显示成图片 中,我讲了如何用 Python 模拟发送数据,如何在 Qt 中高效的接收 UDP 数据包并将 ...

  9. [转]使用QT开发GoogleMap瓦片显示和下载工具

    第一节 之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背 ...

随机推荐

  1. 清北学堂北京大学吴耀轩神仙讲课day5摘要

    今天讲图论 图是啥?(白纸上的符号?) 对于一个拥有n个顶点的无向连通图,它的边数一定多于n-1条.若从中选择n-1条边,使得无向图仍然连通,则由n个顶点及这 n-1条边(弧)组成的图被称为原无向图的 ...

  2. SpringCloud组件架构图

    总结一下spring cloud 的结构: 1.请求统一通过API网关(Zuul)来访问内部服务. 2.网关接收到请求后,从注册中心(Eureka)获取可用服务 3.由Ribbon进行均衡负载后,分发 ...

  3. iOS控件圆角与半圆角

    开发过程中难免用到圆角以及恶心的半圆角,看代码 半圆角:这是把左边的两个角切成了圆角 UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoun ...

  4. 基于python的知乎开源爬虫 zhihu

    今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就 ...

  5. Flask【第11篇】:整合Flask中的目录结构

    整合Flask中的目录结构 一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import ...

  6. centos6.5下修改系统的roo用户/非root用户的密码

    1.修改系统root用户的密码 [........~]# passwd然后输入新密码,若提示密码太简单,无需理会,直接敲回车: 然后再次输入新密码,即可修改成功. 2.修改系统非root用户的密码:e ...

  7. Vue结合webpack实现路由懒加载和分类打包

    https://blog.csdn.net/weixin_39205240/article/details/80742723

  8. WIN 7 的vs2008 试用版评估期结束的解决方法

    1. 在VS2008安装目录下把Setup/setup.sdb文件中的 [Product Key] T2CRQGDKBVW7KJR8C6CKXMW3D 改成 [Product Key] PYHYPWX ...

  9. ef 分页

    public List<TEntity> FindList(Expression<Func<TEntity, bool>> predicate, Paginatio ...

  10. net core 返回404方法

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { ...