QT-使用QLinearGradient生成比色卡,将QVector转换成伪彩图

简介: QT-使用QLinearGradient生成比色卡,将QVector转换成伪彩图
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_mvCameraWidgets.h"
#include <QRect>
#include<opencv2/opencv.hpp>
#include<QPainter>
#include <QWindow>
#include <QScreen>
#include <QDesktopWidget>
#include <QGradient>
#include <QVector>
using namespace cv;
using namespace std;
class mvCameraWidgets : public QMainWindow
{
    Q_OBJECT
public:
    mvCameraWidgets(QWidget *parent = nullptr);
    ~mvCameraWidgets();
  void paintEvent(QPaintEvent *event) override; // 重绘事件
private slots:
};
void mvCameraWidgets::paintEvent(QPaintEvent * event)
{
  //ui.colormap为一个QLabel
  //设置比色卡
  QPainter painter(this);
  painter.setRenderHint(QPainter::Antialiasing);//反锯齿
  int x = ui.colormap->x();
  int y = ui.colormap->y();
  int w = ui.colormap->rect().width();
  int h = ui.colormap->rect().height();
  QLinearGradient linearGradient(0, y, 0, y+h);//渐变区域
  linearGradient.setColorAt(0, Qt::red);
  linearGradient.setColorAt(0.5, Qt::blue);
  linearGradient.setColorAt(1, Qt::green);
  painter.setBrush(linearGradient);//设置画刷,则painter.drawRect(rect());绘制出渐变背景
  painter.drawRect(QRect(x,y,w,h));
}
QImage intChangetoQcolorimg(int img_width, int img_height, QVector<double>& magnetic_strength, double down, double up, QImage & image0)
{
  int w_pic = img_width;
  int h_pic = img_height;
  QVector<QRgb> rgbColourTable;
  unsigned char     *Buffer;    //磁场强度信息值,根据在上下限up,down中比例转换到0-255
  Buffer = (unsigned char *)malloc(w_pic*h_pic);
  QImage img = QImage(Buffer, w_pic, h_pic, QImage::Format_Indexed8);
  if (w_pic*h_pic!=magnetic_strength.size())
  {
    return img;
  }
  if (down >= up)
  {
    return img;
  }
  for (int i = 0; i < w_pic*h_pic; i++)
  {
    if (magnetic_strength[i] <= down)
    {
      Buffer[i] = (uchar)0;
    }
    if (magnetic_strength[i] >= up)
    {
      Buffer[i] = (uchar)255;
    }
    if ((magnetic_strength[i] < up) && (magnetic_strength[i] > down))
    {
      int tmp = (magnetic_strength[i] - down) / (up - down) * 255;
      uchar utmp = (uchar)tmp;
      Buffer[i] = utmp;
    }
  }
  QImage copyImage = img.copy(); // 复制整个图像
  for (int y = 0; y < 256; y++)
  {
    QColor color;
    int index = (int)((float)(y) / (float)(255) * (float)(image0.height() - 2));
    if (index == 0)
    {
      color = image0.pixelColor(QPoint(1, image0.height() - 2));
    }
    else if (index == image0.height() - 2)
    {
      color = image0.pixelColor(QPoint(1, 1));
    }
    else
    {
      color = image0.pixelColor(QPoint(1, image0.height() - 2 - index));
    }
    QRgb rgb = color.rgb();
    rgbColourTable.push_back(rgb);
  }
  copyImage.setColorTable(rgbColourTable);
  if (Buffer != NULL)
  {
    free(Buffer);
    Buffer = NULL;
  }
  return copyImage;
}
void mvCameraWidgets::on_pushButton_colormap_clicked()
{
  //构造一组数据
  QRect roi;
  int w_pic = 200;
  int h_pic =2000;
  QVector<double>     magnetic_strength;
  for (int y = 0; y < h_pic; y++)
  {
    for (int x = 0; x < w_pic; x++)
    {
      double d = (double)(x/5.0) ;
      magnetic_strength.push_back(d);
    }
  }
  //设置渐变图在重写的paintEvent函数里
  QPixmap pix = grab(QRect(ui.colormap->x(), ui.colormap->y(), ui.colormap->width(), ui.colormap->height()));
  QImage image0 = pix.toImage();
  QImage img =intChangetoQcolorimg(w_pic, h_pic, magnetic_strength, down, up, image0);
  img.save("img/image_mapping.png");
}
```![最终的伪彩图](https://ucc.alicdn.com/images/user-upload-01/de12992037ec4d319d590298a8b72666.png#pic_center)
![构建的灰度图](https://ucc.alicdn.com/images/user-upload-01/76022e4d17fb4b068e5c77d90c1ae3bf.png#pic_center)
![比色卡](https://ucc.alicdn.com/images/user-upload-01/6a1b2d7adf244267a04f8507a1aae412.png#pic_center)
目录
相关文章
|
7月前
|
存储 容器
Qt中 QMap 类、QHash 类、QVector 类详解
Qt中 QMap 类、QHash 类、QVector 类详解
Qt中 QMap 类、QHash 类、QVector 类详解
|
7月前
|
存储 安全 算法
Qt QVector 详解:从底层原理到高级用法
Qt QVector 详解:从底层原理到高级用法
408 0
|
容器
1.QT中的容器QVector,QList,QSet,QMap,QQueue,QStack,QMultiMap,QSingleList等
1  新建一个项目 在pro文件中只需要加上CONFIG += C++11 main.cpp #include &lt;QMap&gt;   int main() {     QMap&lt;int,QString&gt; map;     map.
2323 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
201 1
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
118 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
|
3月前
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
210 2
Qt开发网络嗅探器02
Qt开发网络嗅探器02