文章目录

  • 1. 前置知识
  • 2. 方法1 不靠谱,但很方便的资源替换法
  • 3. 方法2 使用PeFile库修改图标
  • 4. 优化体验 接受jpg、png、bmp等格式的图片作为icon
  • 参考链接
    • Python打包工具-QPT

这部分网上资料有点太少了…

在做Python 打包工具https://github.com/QPT-Family/QPT(将Python程序打包为EXE)项目的时候,有自定义EXE图标的需求,但QPT走的是SFX方案生成EXE,而且QPT是基于Python打造的,这就使得需要使用使用Python修改EXE的图标。

话不多说,俩方案,一个靠谱的,一个不靠谱的,先讲不靠谱的,因为不靠谱的很方便。

但在此之前,我们需要先准备仨材料:

  1. 生成的EXE
  2. Icon-A(EXE原始的Icon)
  3. Icon-B(需要被替换的Icon)

EXE可以用C++直接生成一个就好,源码可以是:

#include <iostream>
using namespace std;
int main(){cout << "Hello 老张" << endl;system("pause");return 0;
}

icon的话,可以去QPT项目下直接找https://github.com/QPT-Family/QPT ,放在了ext/rc目录下,有俩不像样的icon。

准备基础的文件后,我们还要先了解一些基础的知识~

1. 前置知识

用一句话概括,那就是修改PE(Portable Executable)信息来达到修改图标的目的。

当然,想深入了解PE的话,本文是不会写的,但不妨碍去网上搜索哈哈哈,这里只讲一下怎么修改图标。

首先,我们在构建EXE的时候,指定了一个Icon,这个Icon在生成EXE后会出现哪里呢?
如果你安装了7-zip这样的工具,不妨试试看是否当作压缩包来打开(实际上显示的是类PE结构),打开后如下图所示:

可以很清晰的看见各部位的偏移、以及其虚拟地址,包括资源大小也是能看到。
这时,我们再打开资源部分(.rsrc),找到ICON所在的资源位置,如下图所示:

解压后就会发现,这就是EXE的那个Icon!

好了,前置知识已经讲完了,接下来就先是不靠谱的操作了。

2. 方法1 不靠谱,但很方便的资源替换法

我们知道PE中是有1.ico这个文件的,那么我们直接用open()函数打开这个exe文件,直接替换掉这个icon不就可以了吗?
没错,就是这样,非常简单!

exe = r"exe文件"
icon = r"tmp_icon.ico"
icon2 = r"test_icon.ico"# 二进制方式读取exe
with open(exe, "rb") as f:pe = f.read()# 读取我们生成EXE时候的那个icon文件
with open(icon, "rb") as f:ic_b = f.read()# 读取我们要替换的icon文件
with open(icon2, "rb") as f:ic_b2 = f.read()# 从22的位置开始替换 - 为什么是22?可以自行了解一下图像文件的格式
pe = pe.replace(ic_b[22:], ic_b2[22:])# 写入硬盘
with open("text3.exe", "wb") as f:f.write(pe)

这个方法之所以说不靠谱,是因为所有的资源文件,都有可能会被替换,例如程序中嵌入了一个ico,和应用程序的图标是一个icon,那么pe.replace(ic_b[22:], ic_b2[22:])会一视同仁。

最重要的是,还要考虑替换前后的图像信息长度。

那么接下来就是靠谱的方式了

3. 方法2 使用PeFile库修改图标

这里,非常建议先安装一个ExeScope,因为方便我们查看地址信息,不想安装的话也没什么问题,用PeFile也能打印出结构。

那么我们就先使用ExeScope打开EXE,找到图标所在位置吧~


然后选择二进制查看

我们可以看到图标所在的地址起始是0001D6E8,在Python中我们可以表示为0x1D6E8,接下来我们就使用PeFile来修改吧~

pe = pefile.PE(exe)
# offset 可从ExeScope中获取
rva = pe.get_rva_from_offset(0x1D6E8)
pe.set_bytes_at_rva(rva, ic_b2[22:])
f = pe.write()
with open("text4.exe", 'wb') as final_f:final_f.write(f)

4. 优化体验 接受jpg、png、bmp等格式的图片作为icon

这部分就得上很强大的pillow了,其实我们的问题不应该是如何让jpg、png、bmp嵌入EXE中,而是让它们变成ico格式就好,代码很简单:

    img = Image.open(img_path).resize((128, 128))img.save(ico_save_path, sizes=[(128, 128)])

参考链接

Python打包工具-QPT

在QPT中,对应的代码位置为:https://github.com/QPT-Family/QPT/blob/开发分支/qpt/kernel/qpe.py ,如有变动请自行在QPT中查找~

使用Python修改可执行文件-EXE的图标相关推荐

  1. 【PE系列】Windows平台为可执行文件exe添加图标的方法

    DATE: 2018.12.27 1.参考 https://blog.csdn.net/GoForwardToStep/article/details/78623273 https://blog.cs ...

  2. 终于修改了EXE的图标罗

    这些天研究怎样修改EXE文件里面的图标,看了antghazi<<如何修改可执行文件的图标>>一文,一开始连代码该怎么打也不知道,后来代码拼出来了,有些地方还是不明白,耽搁了两三 ...

  3. Python生成可执行文件.exe

    1.初次使用需要安装pyinstaller Ctrl + r 输入cmd打开命令行 输入以下内容安装pyinstaller库 pip install pyinstaller -i http://mir ...

  4. 把python文件转exe文件 和 打包报错处理

    今天,我教大家怎么把py文件转换成exe文件, 首先,我们要用到一个第三方库,他就是pyinstaller pip install pyinstaller zip包下载(CSDN)免费 Pyinsta ...

  5. 如何给生成的exe加图标

    一.简述 今天就简单介绍一下如何给exe加图标,其实很简单,但是主要是为了讲述另一个问题,这也是之前遇到的一个容易忽略的问题. 首先我们了解一下一共有多少个图标可以设置. 看到下面这张图,我们首先会了 ...

  6. python图标的演变_把Python脚本生成exe文件并添加版本信息和自定义图标

    pyinstaller和py2exe把Python脚本生成exe文件,并添加版本信息和自定义图标. 写了一个查找产品通道号的小程序,目前还没进行异常处理. 以下是程序源码. # -*- coding: ...

  7. 如何修改可执行文件的图标

    如何修改可执行文件的图标 创建时间:2001-12-17 文章属性:转载 文章来源: www.xici.net/main.asp 文章提交: wzfish (wzfish_at_21cn.com) 本 ...

  8. C#怎么修改生成的EXE文件图标

    C#怎么修改生成的EXE文件图标 工具/原料 1.VS,Visual Studio 2013或其他版本 2-ico的图标文件一个 方法/步骤 1.打开你的项目文件,如下图,选择release选项 2. ...

  9. python 拆分pdf(有可执行文件exe)

    1.背景 被那些软件pdf拆分整气死了,今天用python写一份pdf拆分的代码. 2.代码:(计算机的可以去学习一下,自己改改) pdf_split.py from PyPDF2 import Pd ...

最新文章

  1. 【VMware虚拟化解决方案】VMware VSphere 5.1配置篇
  2. SpringCloud -创建统一的依赖管理
  3. 是什么职位_2021国家公务员考试职位表出炉!你真的了解什么是公务员吗?
  4. UTF-16 -- 顶级程序员也会忽略的系统编码问题,JDK 错了十年!
  5. mysql 测试 缓存_mysql 缓存开启及测试
  6. dev万能头文件_超级好用的C++万能头文件
  7. SpringBoot整合J2Cache
  8. matlab时域采样与频域采样,实验二:时域采样与频域采样.doc
  9. 大陆车牌识别算法的背景与技术
  10. 【图像隐藏】基于matlab像素预测和位平面压缩的加密图像可逆数据隐藏【含Matlab源码 2218期】
  11. Ele SOA Container
  12. 苹果也被撕下遮羞布,iPhone14后继乏力,靠十三香维持销量
  13. 2022-2028全球军用弩行业调研及趋势分析报告
  14. js 跳转到指定位置 高德地图_JS引入高德地图定位
  15. oracle体育成绩字段,在Excel中利用自定义函数处理体育达标成绩
  16. 《程序设计基础》 第十章 函数与程序结构 6-5 递归求简单交错幂级数的部分和 (15 分)
  17. USB 设备驱动之设备接入梳理(六)
  18. 如何成为一名技术专家
  19. DAC8760+STM32F407单电源电路硬件测试
  20. JavaScript原型链污染攻击

热门文章

  1. case when和select case when的用法
  2. 微信小程序(env: Windows,mp,1.05.2108130; lib: 2.19.4)报错
  3. 一份实用的seo整体优化方案
  4. 零停机给Kubernetes集群节点打系统补丁
  5. Python第三方库pygame学习笔记(一)
  6. 前端面试之html+css【一】
  7. OneNote for Windows 10 笔记的导出
  8. 怎么操控开发的浏览器_【钉钉教学直播辅助神器】让你的手机成为电脑的外置摄像头,可用KVM操控手机的在线直播神器...
  9. 史上最全折纸教程(全图文)
  10. 程序员的十层楼(http://softwareblogs-zho.intel.com/2009/02/04/1071/)