QWidget绘制图片
程序员文章站
2022-03-21 13:59:39
...
在qt代码中图像操作及显示,如果不加入opencv的话,很多情况下都是使用QImage类管理图像。
QImage图片格式
QImage类中图片格式类型枚举:
enum Format {
Format_Invalid,
Format_Mono,
Format_MonoLSB,
Format_Indexed8,
Format_RGB32,
Format_ARGB32,
Format_ARGB32_Premultiplied,
Format_RGB16,
Format_ARGB8565_Premultiplied,
Format_RGB666,
Format_ARGB6666_Premultiplied,
Format_RGB555,
Format_ARGB8555_Premultiplied,
Format_RGB888,
Format_RGB444,
Format_ARGB4444_Premultiplied,
Format_RGBX8888,
Format_RGBA8888,
Format_RGBA8888_Premultiplied,
Format_BGR30,
Format_A2BGR30_Premultiplied,
Format_RGB30,
Format_A2RGB30_Premultiplied,
Format_Alpha8,
Format_Grayscale8,
#if 0
// reserved for future use
Format_Grayscale16,
#endif
#ifndef Q_QDOC
NImageFormats
#endif
};
Format_RGB32
、Format_RGB888
与Format_Alpha8
为我们最常用的图像格式。
-
Format_RGB32
: 一个像素占四字节内存(刚好quint32类型,所以为RGB32),前三字节为RGB值,第四字节为灰度值。 -
Format_RGB888
:一个像素占三字节,即RGB值,每个占一字节。 -
Format_Alpha8
:此格式为灰度图像,一个像素占一个字节。(Alpha8可以为RGB32像素最后一位灰度值)
创建QImage
创建一张大小为40*40,格式为Format_RGB888的图片:
QImage *mImage;
mImage = new QImage(40,40,QImage::Format_RGB888);
其他格式图片也是此方法,只是不同格式,QImage中数据大小不一样,Format_RGB888格式占内存大小为 W * H * 3 字节,其他格式类似计算 。
赋值QImage
- 直接内存拷贝(速度快,效率高)
memcpy(mImage->bits(),data.data(),width*height*3); //直接内存拷贝
此方法需要知道图像的格式,然后确认对应占用的内存大小,最后就是依据内存大小拷贝数据。Format_RGB888格式为 W * H * 3 字节,所以拷贝函数第三参数为 width * height * 3 。
- 像素级赋值操作
for(int w = 0;w < width;w ++) //像素级赋值操作
{
for(int h = 0;h < height;h ++)
{
int pos = (h*40 + w)*3;
int r = data.at(pos);
int g = data.at(pos+1);
int b = data.at(pos+2);
mImage->setPixel(w,h,qRgb(r,g,b));
}
}
此方法可兼容Format_RGB32
、Format_RGB888
格式,因为直接赋值像素的rgb,所以只要有rgb内存就可以被操作。
绘制QImage
基本操作就是在QWidget
中绘制使用重写paintEvent
函数进行图片的绘制,这里需要注意QWidget
和图片的长宽比例。
void Class_Name::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QRect rect(0,0,this->width(),this->height());
painter.drawImage(rect,*mImage);
painter.end();
}
QImage显示的方法有很多,但是为什么使用重写paintEvent
函数的方法,个人认为是效率和占用内存此方法都是最小。
上一篇: Matplotlib输出中文显示问题
推荐阅读
-
微信开发如何上传图片?
-
iOS15如何查看EXIF信息以及图片来源
-
基于CSS3淡入淡出效果的图片轮播_html/css_WEB-ITnose
-
CodeIgniter上传图片成功的全部过程分享_PHP教程
-
PPT图片怎么添加金字塔立体效果? ppt金字塔效果的制作方法
-
ppt怎么制作图片重点列表? ppt创意列表的制作方法
-
PPT2016图片怎么添加渐变玻璃风效果? ppt毛玻璃效果封面的做法
-
PPT怎么绘制大树图形? ppt树木的画法
-
上传图片的时候,就弹出选择本map">
求php+ajax上传图片的实例!用的不是files,点击上传图片的时候,就弹出选择本map
-
php页面返回图片有关问题