QT4 如何在 QLabel 上显示二值图和灰度图 ???

QT4 如何在 QLabel 上显示二值图和灰度图 ???,第1张

1、如果你是从文件读,
那么直接用QImage或QPixmap的带有文件路径的构造函数构造一个对象,
然后用QLabel的setPixmap
2、如果你的图像已经存在内存中,你只是想进行如ARGB转换成灰度或是2值图像的话,
那么你可以用QImage的成员函数convertToFormat进行转换
其中第一个参数是一个枚举类型,表示的是你的图像类型,如8位的灰度类型或是RGB类型等
文档解释的很清楚,可以自己看。
注意一点就是QImage可以转换成QPimap,转换是很快的,浅引用里面的ImageData而已,详细内容你可以看源码,于是你就可以通过QLabel的setPixmap进行显示了
3、如果你是想通过字节自己变化,
那就直接通过QImage或是QPixmap的scanLine获取起始的字节指针
然后根据图像的宽度进行遍历就是,关于RGB和灰度转换的算法或是根据阈值转换2值图像的算法有很多,自己去研究吧。最后将你处理的设置到QLabel就行了
一点建议:如果你真要在Qt上做一些图像算子处理什么的,别用QLabel,QLabel是轻量级的,你最好是用GraphicsView-Scene-item这个去做
补充的问题回答:
你颜色空间都不一样,那就不能直接读了,你可以先将YUV的颜色空间转换成Rgb24的,Qt只支持HSV,HSL,CMYK,RGB这四种颜色空间。。
所以你自己先将该图像的字节流数据用文件流的方式读,然后根据颜色空间转换的算法转换成RGB24,然后可以根据你转换后的整个字节数组获得一个QImage或是QPixmap
继续补充:二值图就是1个像素是1位,不是很清楚你问的问题“如何知道二值图是24位或8位”,你能描述清楚点么,你要是不懂图像处理,就搞个PPT或是书研究下基础吧。
你要是有什么问题可以HI我…

px solid green;
border-radius: 4px;
padding: 2px;
background-image: url(images/xxxpng);
}
请确认一下你的 style sheet 代码是不是与上面类似的(主要看最后一行);
如果你改变了或者qrc文件中的内容,最好将整个工程重新都重新编译一次。再看能不能显示。如果还不能显示,就直接用QLabel的
void setPixmap ( const QPixmap & )
方法来设置算了。

//假如label的名称是show_label
void xx::show(const QSt//假如label的名称是show_label
void xx::show(const QString &file)
{
QPixmap pix;
pixload(file);
pix=pixscaled(ui->show_label->width(),ui->show_label->height());
ui->show_label->setPixmap(fix);
}
int main()
{
show(tr("/images/openpng"));//显示/images/openpng的
return 0;
}

重写这个控件
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemWindowsForms;
using SystemDrawing;
class newlabel : Label
{
protected override void OnPaint(PaintEventArgs e)
{
float lineHeght,lineWidth;
lineHeght = thisHeight/2;
lineWidth = thisWidth;
baseOnPaint(e);
eGraphicsDrawLine(PensRed, 0, lineHeght, lineWidth, lineHeght);
}
}
你只需要在form初始化时,Label lable1 = new newlabel();
就可以了

Qt绘图要用到QPainter类,绘图的设备通常是主部件,也可以是QLabel部件或QTextEdit部件,通过一定的算法实现可以绘制出图形,绘制时需要先定义一个QPainter类对象,绘制可以选择的道具可以使Qpen(画笔)、QBrush(画刷)。

使用QPen写文本时还可以指定字体(QFont类),如下面一段代码:

QPanter painter;
QPen pen;
pensetColor(QColor(255,0,0));  //设置画笔为红色
paintersetPen(pen);  //选择画笔
painterdrawLine(0,0,100,100); //用该红色画笔画一条线,起点(0,0),终点(100,100)
painterend(); //结束绘制。绘制时使用的任何资源都被释放。虽然有时不需要调用end(),析构函数将会执行它

继承QLabel,重写mouseMoveEvent(QMouseEvent ev)
mousePressEvent(QMouseEvent ev)
mouseReleaseEvent(QMouseEvent ev)
和PaintEvent结合用
用函数QLabel::mapFromGlobal获取鼠标点相对于qlabel的位置,在paintevent中drawline


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13213055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存