当前位置: 首页 > article >正文

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文件:


http://www.kler.cn/a/540233.html

相关文章:

  • Android图片加载框架Coil,Kotlin
  • 【Javascript Day12】数组操作方法及String规则和方法
  • 从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓
  • 深度学习 交易预测 LSTM 层的神经元数量、训练轮数
  • 指定路径安装Ollama
  • 保姆级教程Docker部署Zookeeper模式的Kafka镜像
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-metrics.py
  • AGI的基石:什么是机器学习
  • 【DeepSeek × Postman】请求回复
  • UP-VLA:具身智体的统一理解与预测模型
  • USB子系统学习(四)用户态下使用libusb读取鼠标数据
  • 深度学习-与OCR结合
  • react脚手架搭建react项目使用scss
  • windows 边框函数 画笔
  • MIT6.824 Lecture 2-RPC and Threads Lecture 3-GFS
  • Post-trained猜想
  • 长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾
  • 安装 Ollama 需要哪些步骤?(windows+mac+linux+二进制+Docker)
  • 云原生(五十四) | RDS数据导入与导出
  • Jenkins设置防火墙规则允许访问本机IP端口
  • 面试高频题拆解
  • 如果一个服务器突然间变的很卡,该如何排查?
  • 局域网内别的电脑怎么连接到对方的mysql数据库
  • 前后端分离的网页游戏,后端spring boot,前端vite+vue
  • 深度学习 OpenAI的DALL-E等模型可以根据用户输入的文字描述生成图像
  • NO.10十六届蓝桥杯备战|cout格式控制|习题(C++)