环境参数:
操作系统:windows 10
QT版本:5.12.12
因为最近项目需要LCD屏幕需要显示各种字符,频繁取模,所以就想着写一个批量取模的工具
原理: 按照需求取模的方法去遍历图片的像素点。
1、首先因为我需要批量取模,所以需要遍历文件夹中所有的图片
//先选择文件夹
this->Path = QFileDialog::getExistingDirectory(this,tr("选择目录"),"C:/");
//文件夹的信息使用QDir
this->dir = new QDir();
//设置文件夹路径
this->dir->setPath(Path);
//获取目录信息
QStringList file_name;
QFileInfoList file_a = this->dir->entryInfoList(file_name,QDir::Files | QDir::NoDotAndDotDot);
//这块获取文件夹中的文件个数 用于后续遍历
this->FileNum = file_a.size();
2、遍历文件夹并且遍历图片的像素点
//使用QPixmap打开图片
this->Mpx = new QPixmap();
//遍历文件
for(int i =0;i<file_a.size();i++)
{
// ....这块可以判断文件类型,避免除了取模图外的文件
//遍历并加载图片
this->Mpx->load(file_a.at(i).filePath());
//将图片转为Image
QImage image =this->Mpx->toImage();
//获取图片的高度和宽度
this->h = image.height();
this->w = image.width();
//用于记录取模后每8个像素点的16进制数
unsigned char HexNum = 0x00;
// 16进制数组 用于记录整张图片的像素取模16进制结果
QByteArray hexArray;
//我为竖向取8个像素点 后续w+1 继续取h(0-7)的像素 此变量用于确定h的位置
int ENum =0;
//用于h不为8的倍数时补齐
int Byte = 0;
//此变量为记录取模后十六进制数的数量 用于后续的8k、4k补齐(看个人需要)
int hexNum = 0;
//****************下面为取模的方式
if(this->h % 8 != 0)
{
Byte = h/8 +1;
}else
{
Byte = h/8;
}
for(int p =0;p<Byte;p++)
{
ENum = p * 8;
for (int x = 0; x < this->w; ++x)
{
//遍历8个像素点为一个十六进制数
for (int y = 0; y < 8; ++y)
{
//通过w 和 h 确定像素点的位置
QRgb pixelValue = image.pixel(x, y+ENum);
//目前我写的是判断黑色像素点
if (qRed(pixelValue) == 0 && qGreen(pixelValue) == 0 && qBlue(pixelValue) == 0)
{
// 处理黑色像素的坐标,可以根据需要进行操作
HexNum = ((HexNum>>1) | (1<<7));
}else
{
//HexNum = HexNum >> 1;
HexNum = HexNum >> 1;
}
}
hexNum++;
//将16进制数添加如数组
hexArray.append(HexNum);
HexNum = 0;
}
}
QString hexString;
int res = 0;
//将所有16进制数合成为一个字符串,每16个16进制数换行
for(int l=0;l<hexArray.length();l++)
{
hexString += QString("0x%1").arg(static_cast<quint8>(hexArray.at(l)), 2, 16, QChar('0')) + ",";
res++;
if(16 == res)
{
hexString += "\n";
res=0;
}
}
//末尾补换行
hexString +="\n";
//将取模出来的数组显示在textedit中
this->ui->textEdit->setText(this->ui->textEdit->toPlainText()+hexString);
}
3、导出为文件
// 创建QFile对象
QFile file(this->Path+"\\"+this->ui->FileName->text());
// 打开文件,如果文件不存在则创建
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "无法打开或创建文件";
QMessageBox::information(this,"批量取模","无法打开或创建文件");
return;
}
// 使用QTextStream写入内容到文件
QTextStream stream(&file);
stream <<"const unsigned char b2c[]=\n{\n";
stream <<this->ui->textEdit->toPlainText();
stream <<"}\n";
// 关闭文件
file.close();
qDebug() << "文件操作完成";
QMessageBox::information(this,"批量取模","文件操作完成");
功能其实很简单,主要就是遍历图片的像素点,按照你的取模方式按顺序遍历8个像素点为一个16进制数,然后将16进制数保存,一张图片遍历完然后直接输出在TextEdit控件,等所有图片遍历完之后可以设置个按钮将控件内的内容写入文件就好了,至于彩色的图片取模也是同理的,在取模逻辑判断那块去判断就好了!