目录
运行效果
测试图片
代码:
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_selectBtn_clicked();// 选择图片文件
void on_colorBtn_clicked();// 设置查找颜色
void on_calcBtn_clicked();// 计算宽度
private:
Ui::Dialog *ui;
QString filePath;// 图片文件路径
QColor color;// 查找的颜色
int nLineWidth;// 线条的水平方向
int nLineHeight;// 线条的垂直方向
QImage img;// 加载的qimage
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QFileDialog>
#include <QDebug>
#include <QImage>
#include <QColorDialog>
Dialog::Dialog(QWidget *parent) : QDialog(parent),
ui(new Ui::Dialog),
filePath(""),
color(),
nLineWidth(0),
nLineHeight(0)
{
ui->setupUi(this);
ui->calcBtn->setEnabled(false);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_selectBtn_clicked()
{
filePath = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("选择图片文件"),".","Images (*.jpg *.png)");
qDebug()<<filePath;
ui->fileEdit->setText(filePath);
}
void Dialog::on_colorBtn_clicked()
{
color = QColorDialog::getColor();
qDebug()<<color;
qDebug()<<"red="<<color.red();
qDebug()<<"green="<<color.green();
qDebug()<<"blue="<<color.blue();
qDebug()<<"alpha="<<color.alpha();
ui->calcBtn->setEnabled(true);
}
void Dialog::on_calcBtn_clicked()
{
QFile file(filePath);
if (file.open(QIODevice::ReadOnly))
img.load(filePath);
qDebug()<<"图片宽度="<<img.width()<<",图片高度="<<img.height();
int red,green,blue;
nLineWidth = 0;
nLineHeight = 0;
// 横向计算
for (int j = 0;j <img.height();j++) {
QRgb *imageScanLine = (QRgb*)img.scanLine(j);// 获取一整行
if (nLineWidth > 0)// 如果已经获得了宽度则停止计算
break;
for (int i =0;i<img.width();i++) {
// 获取rgb值
red = qRed(imageScanLine[i]);
green = qGreen(imageScanLine[i]);
blue = qBlue(imageScanLine[i]);
// 匹配计算,允许线条边缘处的误差
if (qAbs(red - color.red())<10 && qAbs(green - color.green())<10 && qAbs(blue - color.blue())<10)
nLineWidth++;
}
}
// 纵向计算
for (int row = 0;row <img.width();row++)
{
if (nLineHeight > 0)
break;
for (int col = 0;col <img.height();col++)
{
QRgb *imageScanLine = (QRgb*)img.scanLine(col);
red = qRed(imageScanLine[row]);
green = qGreen(imageScanLine[row]);
blue = qBlue(imageScanLine[row]);
if (qAbs(red - color.red())<10 && qAbs(green - color.green())<10 && qAbs(blue - color.blue())<10)
nLineHeight++;
}
}
ui->linewidthEdit->setText(QString::number(nLineWidth));
ui->lineheightEdit->setText(QString::number(nLineHeight));
}