qt制作一个png格式转ico格式的工具
下载FreeImage zip包:
FreeImage download | SourceForge.net
不需要编译,我们需要头文件和库:
在pro文件中包含头文件和链接库:
QT界面:
*(使用QSS:
)
code:
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QFileDialog>
#include <QFileInfo>
#include "FreeImage.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//png转ico接口
void PNGToICO(const char* pngFilePath, const char* icoFilePath);
//获取文件名称
QString getPngFileName(QString inputPath);
private slots:
void pickImage();
private:
Ui::Widget *ui;
//输出路径
QString outputPath;
//文件路径
QString pngInputPath;
};
#endif // WIDGET_H
Widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置窗口标题
//初始化输入路径
pngInputPath="";
//初始化输出路径 D:/xiang_ce/notepad++/COPY.png
outputPath="../../output/";
setWindowTitle("png转ico工具");
//label可以换行显示
ui->label_2->setWordWrap(true);
ui->label_3->setWordWrap(true);// 启用自动换行
//点击按钮弹出对话框,选择图片
connect(ui->pushButton,&QPushButton::clicked,this,&Widget::pickImage);
//
connect(ui->pushButton_2,&QPushButton::clicked,this,[=](){
QString str1 = ui->label_2->text();
QString str2 = ui->label_3->text();
// 将 QString 转换为 const char* (UTF-8 编码)
QByteArray utf8Bytes1 = str1.toUtf8();
QByteArray utf8Bytes2 = str2.toUtf8();
const char* cStr1 = utf8Bytes1.constData();
const char* cStr2 = utf8Bytes2.constData();
PNGToICO( cStr1,cStr2);
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::PNGToICO(const char* pngFilePath, const char* icoFilePath) {
// 初始化FreeImage库
FreeImage_Initialise(true);
// 加载PNG文件
FIBITMAP* dib = FreeImage_Load(FIF_PNG, pngFilePath);
if (!dib) {
qDebug() << "Failed to load PNG file.";
FreeImage_DeInitialise();
return;
}
// 调整图像尺寸到合适的 ICO 尺寸(这里选择 32x32 作为示例)
int targetWidth = 32;
int targetHeight = 32;
FIBITMAP* resizedDib = FreeImage_Rescale(dib, targetWidth, targetHeight, FILTER_BILINEAR);
if (!resizedDib) {
qDebug() << "Failed to resize image.";
FreeImage_Unload(dib);
FreeImage_DeInitialise();
return;
}
FreeImage_Unload(dib); // 释放原始图像数据
// 尝试保存为ICO格式
BOOL success = FreeImage_Save(FIF_ICO, resizedDib, icoFilePath, 0);
if (!success) {
qDebug() << "Failed to save ICO file. Error:" ;
} else {
qDebug() << "Successfully converted PNG to ICO.";
}
// 清理资源
FreeImage_Unload(resizedDib);
FreeImage_DeInitialise();
}
void Widget::pickImage(){
// 打开文件对话框,让用户选择图片文件
QString fileName = QFileDialog::getOpenFileName(this,
tr("选择图片"),
"",
tr("Images (*.png *.xpm *.jpg);;All Files (*)"));
if (!fileName.isEmpty()) {
// 显示选中的图片路径
ui->label_2->setText(fileName);
//显示输出路径
QString name=getPngFileName(fileName);
QString name2=outputPath+name.left(name.length() - 4) + ".ico";
ui->label_3->setText(name2);
}
//label显示图片
QPixmap pixmap(fileName);
ui->label->setPixmap(pixmap.scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
//获取文件名称
QString Widget::getPngFileName(QString inputPath){
// 使用 QFileInfo 获取文件信息
QFileInfo fileInfo(inputPath);
// 获取文件名(包括扩展名)
QString fileName = fileInfo.fileName();
return fileName;
}
运行截图:
路径下的ico文件: