【Qt开发】将内存图像数据封装成QImage V2
当采用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的更多相关文章
- 将内存图像数据封装成QImage V2
转:http://www.cnblogs.com/bibei1234/p/3161555.html 如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行 ...
- 【Qt开发】如何将内存图像数据封装成QImage V1
如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放.旋转)操作.如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像 ...
- 如何将内存图像数据封装成QImage
http://blog.csdn.net/lyc_daniel/article/details/9055787 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放.旋转)操作. ...
- 将QT开发的界面程序封装成DLL,在VC中成功调用
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转
Qt的4个图像类QImage/QPixmap/QBitmap/QPicture 转 (一)QPixmap和QImage的区别 http://www.thisisqt.com/forum/viewthr ...
- 【Qt开发】Qt中图像的显示与基本操作
Qt可显示基本的图像类型,利用QImage.QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放.旋转). 1. Qt可显示的图像类型 参考Qt的帮助文档,可支持的类型,即 ...
- 使用 Qt 获取 UDP 数据并显示成图片(2)
本文首发于 BriFuture 的 个人博客 在我的前一篇文章 使用 Qt 获取 UDP 数据并显示成图片 中,我讲了如何用 Python 模拟发送数据,如何在 Qt 中高效的接收 UDP 数据包并将 ...
- [转]使用QT开发GoogleMap瓦片显示和下载工具
第一节 之前做项目的时候经常遇到需要大量地图背景数据,然后没有数据被逼着去Google上下载瓦片数据在拼接成整张影像的工作,其实遥感影像晚上有很多可以下载到的,但是大部分是作为研究用的,作为GIS的背 ...
随机推荐
- windows 汇编
int main(){ int a = 1; int c = 2; int b; __asm { MOV EAX, a; MOV EBX, c; ADD EAX, EBX; MOV b, EAX; } ...
- 多线程使用@Async注解创建多线程,自定义线程池
转载自博客https://www.jianshu.com/p/7ac04a501eba
- 运维工程师之IDC系列
因为我公司在用浪潮服务器,所以说链接暂时是浪潮服务器 1.用UltraISO制作U盘启动安装系统 链接 http://www.4008600011.com/archives/8816 ones 刻录 ...
- jetcache:在Spring Boot中怎么玩?
- 用Java 实现断点续传 (HTTP)
在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...
- 编译高博十四讲代码遇到依赖项g2o和cholmod的坑
1. 找不到g2o库!在CMakeLists.txt中使用指令 message(STATUS "${G2O_FOUND}") 打印结果为NO. 问题描述: CMakeLists.t ...
- HDU 1711 Number Sequence(KMP)附带KMP的详解
题目代号:HDU 1711 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/ ...
- 大哥带的Orchel数据库的报错注入
0X01 使用报错注入需要使用类似 1=[报错语句],1>[报错语句],使用比较运算符,这样的方式进行报错注入(MYSQL仅使用函数报错即可),类似mssql报错注入的方式. news.jsp? ...
- 测试常用linux命令之系统监测
top命令: cpu使用情况,内存等 du -hs: 查看目录大小 df -h :查看磁盘使用情况 free: 查看电脑整体内存使用情况 uptime:系统时间,用户数目等 vmstat:内存使用,进 ...
- 14 补充 MySQL的创建用户和授权
权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作.那么一般情况在公司之后DBA工程师会创建一个 ...