吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5308|回复: 153
收起左侧

[原创工具] 【Windows】多格式图片转jpg或png工具:any_pic_2_jpg_or_png(v1.12)

    [复制链接]
不谙世事的雨滴 发表于 2024-10-1 20:57
本帖最后由 不谙世事的雨滴 于 2024-11-17 18:03 编辑

教程、exe、还有源码,都在链接里,
有条件的话,尽量选择“【2】百度云”哈,观看使用教程也可以选择去“【3】B站的教程”哈。

这次打包的程序体积超过了100MiB,
蓝奏云放不下,
预计到我写的程序后续可能比较受欢迎,123云盘那边,

我可是“斥巨资”买了3年会员和【 1 TB 】的免登录下载流量包,
都是白花花的银子啊,给我省着点用啊



【1】123云盘
主链接:
https://www.123684.com/s/BSsrTd-eVeD3

备用链接:

https://www.123865.com/s/BSsrTd-eVeD3


【2】百度云

https://pan.baidu.com/s/1cbs4aSqx2tnNfy-NmSihfA?pwd=0000
提取码:0000


【3】B站的教程

https://www.bilibili.com/video/BV1rexveoE9g

还有程序的Github开源地址:

https://github.com/ssh-buanshishi/any_pic_2_jpg_or_png










更新日志:


【11月11日】版本已升级为v1.12

操作演示和教程视频已更新

较v1.1:【核心源码不变】【操作方法不变】

升级如下python库至右侧版本:
psd_tools         1.10.1
pymupdf           1.24.11
crc32c            2.7.1
pywin32           308
pywin32-ctypes      0.2.3
psutil            6.1.0


升级如下第三方库至右侧版本:
ExifTool          13.02


稍微整理了下源码文件夹,方便一键从源码打包程序。


注:由于Python_3.8的寿命周期于2024年10月底到期,pillow、pillow_heif、pymupdf、psd_tools于最近均取消了对Python_3.8的支持,还有rawpy库也在一段时间之前已经取消了对Python_3.8的支持,上面提到的这些库已经升级到了支持Python_3.8的最高版本。


如果后期没有大的bug或者很有必要加入的新功能的话,

★★【v1.12】很有可能是【最后一个支持win7的版本】★★


Python_3.8是支持原生win7的最高的Python版本,再往上的版本其实也不是不能支持,只不过估计需要安装各种补丁包和进行各种魔改,考虑到各位的动手能力和各自的电脑软件环境的差别,即使能一步步完成魔改,是否能正常运行也是未知数,所以后续保险起见,发布新版本的软件时,大概率不会考虑对高版本的Python进行魔改以兼容win7。


Python_3.8这么早就“凉凉”也是很可惜,软件刚刚发布的时候我还在吹“pillow、pillow_heif一直有人在维护,今后的发展很令人期待”的来着,实在没想到打脸来得这么快,这下以后新版本的库不出意外的话只有win10能用了,只能跟各位说声抱歉哈。


【10月12日】版本已升级为v1.1

这个版本已经完善好了
UAC绕过、提升权限、进程重复的判断机制以及PSD不能转换的问题,目前准备更新教程

着急的话,可以自己先摸索起来,软件操作大致上没什么变化,
拖放和命令行的操作依旧和以前一样。

新增了非Administrator用户的UAC绕过功能,解压后双击运行“绕过UAC弹窗【安装/卸载】.bat”,允许UAC弹窗,即可安装绕过UAC的功能,其原理是通过系统自带的计划任务来提升权限。这个绕过UAC的功能仅针对当前登录用户,原因是系统限制,需要以当前用户身份才能运行计划任务,否则拒绝访问。

卸载“绕过UAC”功能的时候,直接去系统的计划任务里找到“any_pic_2_skip_UAC_for_user--【用户名】”字样的任务,
删除即可,或者用程序自带的卸载功能(只能删除当前登录用户对应的计划任务)。


新增“系统自带notepad【推荐显示设置】.reg”,双击确定后,可以让自己电脑上的notepad(系统自带记事本)的显示效果和我这边视频演示的一样,包括字体、字体大小,可以和演示视频里统一,方便后续用notepad查看日志、设置文件,主要就是为了一个“养眼”。










前言:
写这款工具之前,本人一直饱受heic图片查看和转换的困扰,之前身边虽然有“HEIF Utility”这款软件,但不知为何,这软件在多线程处理很多文件时,一直闪退崩溃出错,以致于一次转换往往需要开大概十几次“HEIF Utility”,实在令人崩溃
后来又花了很多时间,在github上找到了一款命令行批处理的heic批量转换软件:https://github.com/automontronic/HEIC,但还是没能躲开时常崩溃出错、有些文件转换不了的命运。后来又找了“Apowersoft HEIC”、迅捷、九雷等一堆转换软件,发现要么收费贵得吓人,要么不开VIP就别想好好用,转换文件的个数死死地限制在3~5张图片,要么就是号称免费,转出来的图片却把自家软件的广告水印占了50%以上……


虽然说良心、全能的图片转换软件还是有的,但现在这状况多少让人感到有点窒息了,加上自己对Python还算熟悉,之前写过一些软件,有信息能自己手搓一款软件出来,遂投入了一两个月的漫长研究过程,翻阅了起码十几个Python库的英文原文的API说明文档,经过一次又一次版本迭代、功能更新以及debug,现在我已经非常有自信将这款软件拿出来分享给各位,并可以非常自豪地说,这估计是在座各位最近这段时间遇到的,特别良心全能的图片转换软件之一。


今天我就“自作主张”,把这款我折腾了两个月的软件的exe可执行文件,使用教程,以及核心源码免费分享给各位,当作是各位的国庆节大礼了


在win10实机和win7虚拟机上的软件运行截图如下:

win10_运行中

win10_运行中

win10_结束时的弹窗

win10_结束时的弹窗

win7_运行中

win7_运行中

win7_结束时的弹窗

win7_结束时的弹窗



软件的源码,光是主模块就有3000多行,这里估计是放不下的,所以截取部分源码作为原创证明,截图如下:

代码截图01

代码截图01



代码截图02

代码截图02



代码截图03

代码截图03



简介:这是一款可以将各种常见图片格式,转换为windows支持比较好的jpg和png格式的软件。

(1)支持将多个【文件夹】或【文件】混合拖放到bat启动器图标上,以及使用cmd命令行传入多个【文件夹】或者【文件】路径作为参数,来唤起程序接收要处理的路径并进行处理。
    对于文件夹:程序将递归遍历文件夹下的所有结构,转换需要转换的图片文件输出文件夹的相同路径
            并将其他文件通过硬链接或者传统拷贝的方法,原样转移到输出文件夹的相同路径下,
            这样就省去了转换后还需要对文件进行额外整理归类的步骤;
    对于单个文件:如果文件的格式没有被设置排除的话,转出的文件位于输入文件同路径下,带“.output”后缀的同名文件。
             如果文件的格式被排除,或者转换过程中出现错误,不会有任何文件被输出。


  注意!!程序目前仅支持转换【只有一帧】【静止图像】,包括GIF、APNG等动图,程序将自动识别并跳过不处理


(2)处理过程中,软件左上角的标题栏处可以实时显示处理进度,包括:目前正在处理的目标路径编号、要处理的目标路径(文件/文件夹)总数、目前正在处理的目标路径中已完成文件的个数,以及当前正在处理的目标路径下文件的总数。


(3)自带运行记录,或者说运行日志功能。文件处理成功、失败或者排除跳过,软件运行过程中大部分可以记录到的出错信息,以及当前批次所采用的设置信息,这些都能在日志中找到。采用的是实时记录,一旦有信息产生就会立马写入日志文件,方便出现故障崩溃后查找最近的日志来debug(实际上软件中途闪退这种情况,我这边到现在也没碰到)


(4)支持根据exif信息,自动将图片旋转到正确位置,旋转后自动更改记录旋转位置的exif信息,使之在图片旋转后“清零”、不残留,使原来的旋转信息不会影响到最终在图片查看软件中呈现的正确旋转位置,同时也保留其他exif信息。


(5)支持自定义输出的jpg和png的图片质量,其中jpg可以设定质量和子采样模式,png可以设定无损压缩的等级(建议用默认的就行了),此外还有约30项设置,给足了软件的设置自由程度。





突出优势:


(1)使用老python版本3.8.6_x64来打包程序,windows平台兼容性良好,所需的最低系统要求为Windows 7 (64位)
   注意!!需要的是64位的系统,原因是pillow_heic这个库在python_3.8.6这个版本只有64位的轮子(.whl)提供,我尝试过自己编译32位的版本,均以失败告终。
   现在的操作系统和处理器主流上都是64位的,不支持32位平台,问题应该不大。


(2)相比“HEIF Utility”和顶上提到的另一款heic转换工具,由于本程序采用的pillow库和pillow_heif插件库都是最新的(虽然根据发布周期,10月份可能还会出新的pillow版本,可能现在就有比10.4.0更新的pillow版本了),相比“HEIF Utility”具有明显的后发优势,经过这么多年的发展,不可否认其中搭载的heic核心编解码器libx265已经完成了多轮改进和优化,性能、稳定性、兼容性相信应该有不小的提升。反应到这个程序中,就是到目前为止,我还没见到过转换失败的heic图片
虽然由于Python_3.8的寿命周期于2024年10月底到期,pillow、pillow_heif、pymupdf、psd_tools于最近均取消了对Python_3.8的支持,还有rawpy库也在一段时间之前已经取消了对Python_3.8的支持,后续win7将不能支持以上库的最新版本,但应该也够用了。


(3)使用Python来编写程序还有个来自语言上的先天优势,除了更易读懂和维护外,在错误捕捉方面也是非常有优势的,程序里几乎所有能出错的地方我都用了try...except...(else...),相比于C#写的“HEIF Utility”,稳定性自然更胜一筹


(4)整个转换过程中,单个文件的转换过程中能做到【接近1次或2次读取(不确定因素是Windows的“Memory Mapped File”的加速机制是否一次将文件全部加载到内存;2次读取的情况是调用exiftool转移exif的时候,exiftool读取源文件获取exif的时候) + 一次写入】的磁盘操作,尤其是对LIVP、PDF、华为动态图片这些“打包图片”的格式,对其中的图片都能做到“一次读取、在内存中转换、然后将最终结果一次性写入输出文件”,没有:“先解压/解包到磁盘文件,然后再在解包出的磁盘文件上读取再转换,最后删掉或者覆盖掉解包出的磁盘文件”这种多余的磁盘读写操作



# ★ 注:v1.1版本升级后的any_pic_2_jpg_or_png利用exiftool自身支持的管道操作,
#     现在支持通过调用exiftool命令行,直接将结果输出到stdout,然后由程序进行捕捉,
#     这样,exiftool写出文件的操作全程都在内存里,
#     最后由“pre_allocate_xxx”函数预分配磁盘空间,
#     一次性从内存直接写出,就不存在磁盘覆写产生的碎片了。
#     所以大可不必担心开启选项“25.”或“27.”会造成多余的磁盘读写操作。
#
#     因此选项“28.【调用……” 已废弃不用,且原先程序中的smartctl和pysmart等检测磁盘硬件类型的组件和库
#     就可以删掉不用了,升级后的程序理论上启动会更快些。


这也是我仔细研究过各个库的API文档后,才能优化到现在这个样子,尤其是livp(实际上是基于zip压缩包的),网上的转换代码大都是先解压zip到磁盘文件,然后再进行转换操作的。


(5)读取文件的全过程均使用系统内核级Memory Mapped File”机制进行加速,对应python的mmap模块
经过我对部分原先不支持mmap模块的python库的修改和优化,使所有的库现在均支持mmap。
至于使用这个机制过后能提升多少速度,现在还不清楚。


(6)使用磁盘空间预分配的方式:写出转换后的图片文件、拷贝文件(原样转移文件时,文件系统不支持硬链接,或者手动设置为传统拷贝时)、写出运行日志和默认配置文件,极大程度上保证了输出的文件是没有磁盘文件碎片的
实现原理是通过调用windows自带的快速创建空白文件的命令“fsutil file createNew”命令,先创建出对应大小的、拥有连续空间的空白文件,然后在这个空白文件上使用覆盖、更新的方式“f=open(...,mode="br+")”将文件数据从内存写出。


(4)和(6)的优势使程序对机械硬盘非常友好,可以放心地处理位于机械硬盘上的照片,而不用担心产生额外的读写动作和文件碎片。


(7)除了默认选择的pillow的exif读取和保存的功能外,还支持额外调用专业exif工具exiftool对图片的exif信息进行增强转移,双重保证下,转换后丢失exif信息的几率大大降低。


(8)拷贝文件,以及从livp和华为动态照片直接导出图片(不转换格式)时,会自动转移源文件的修改日期,方便后续排序和查找对应时间的照片。






程序携带的Python库,以及各个Python库使程序能够支持的格式如下:


(1)【Pillow】:
BMP、DDS、EPS、ICNSICO、JPEG、JPEG2000PNG、TGA、TIFF、WEBP

(2)【
psd_tools】:
PSD

(3)【pillow_heif】(挂载在Pillow上的插件,使Pillow能支持如下格式):
AVIF、HEIF/HEIC


(4)【pillow_jpls】(挂载在Pillow上的插件,使Pillow能支持如下格式)
JPEG-LS(".jls")


(5)【rawpy】:
各种RAW图片格式,由于rawpy这个python库是libraw的一个wrapper(通俗来说就是libraw的Python“翻译官”,通过python代码实现对libraw的操作),
所以理论上支持libraw支持的RAW格式:https://www.libraw.org/supported-cameras
例如:DNG、CR2、CR3、NEF……


(6)【cairosvg】:
SVG


(7)【pymupdf】:
PDF


(8)【zipfile】(配合Pillow、pillow_heif):
LIVP(苹果动态照片)


(9)通过自写算法实现的特殊图片格式:
华为动态照片微信(电脑版)dat加密的图片文件




我相信上面这些列出的支持的格式,已经覆盖了接近90%的日常转换需求,
对比网上那些需要花钱开VIP的那些转换器,虽然不能说“无不及”,就比如说我现在还没找到转换“.ai”图片的免费实用的python库,
以及转换raw图片的速度可能赶不上那些转换器(我试过一个,转换raw图片的速度确实比我的快,不过那个转换器转换heic和小尺寸图片的速度没我的快),
但是起码也覆盖了它们至少80%的格式支持,而且是有“有过之”的可圈可点之处的,比如说对华为动态照片这种少见的格式的支持,转微信dat的软件倒是找见不少,华为动态照片目前有印象的只有github上的这个项目:https://github.com/Trekky12/moving-picture-extract/tree/master ,顺便在这里感谢一下这个github项目的作者Trekky12,毕竟多少也借鉴了他的代码,尽管经过我优化后代码行数和性能应该已经提升了不少了。
还有尤其是磁盘操作方面,我敢说那些网上的转换器十有八九是不会注意转换出的文件碎片的,这一点我这个软件可以说是“稳赢”的。




还有一个最重要的点,我的程序可是免费开源的呀,哪里有什么转换图片个数限制恶心人的水印啊!


现在,在座各位观众老爷们,你们觉得还有花钱开图片转换软件VIP的必要么




开发这个程序的过程中,也有些有点遗憾和期待的地方。


有些遗憾的地方除了上面说到的不支持.ai文件,还有:原先除了“pillow_jpls”这把“屠龙宝刀”(格式太罕见了)之外,其实我还试过加入过“pillow-jxl-plugin”这个“屠龙宝刀”模块,pillow_jpls”对应的“JPEG-LS”格式一样,“pillow-jxl-plugin”对应的是“JPEG-XL”格式(.jxl),同属于jpeg标准大框架下面的一个新的扩展标准,除了“JPEG-LS”、“JPEG-XL”外,还有一个叫“JPEG-XR”的格式,这种格式我至今没找到Pillow插件支持,能找到的估计就只有C语言写的dll和C的源码,以我目前的水平还不足以把这个功能写进程序里,而“pillow-jxl-plugin”由于是用Rust写的,而经过我研究发现Rust只支持win10及以上的操作系统,而且每一版的Rust都是由前一版本的Rust编译出来的,这样即使想用C来编译Rust也泡汤了,于是只好抛弃掉了。



期待的点是,在网上发现了ofd(好像是一种最近推出的国家标准规定的文档)转图片和pdf的python库easyofd:https://pypi.org/project/easyofd/,或许等那个库成熟一些过后,我或许可以考虑加入ofd转图片的功能。





在这里,我也要感谢软件开发期间,为我提供图片样本支持和代码参考的众人,这里就不一一点出了。总之,感谢各位的倾力支持,相信我的成品一定不会辜负你们的期待



OK,最后祝各位观众姥爷国庆假期快乐哈~

免费评分

参与人数 61吾爱币 +71 热心值 +57 收起 理由
VJhao + 1 + 1 我很赞同!
我识故人兮 + 1 + 1 我很赞同!
a13584643 + 1 + 1 谢谢@Thanks!
zkpcool + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
caihuachaorou87 + 1 + 1 谢谢@Thanks!
lgh978 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qwerty200696 + 2 热心回复!
jnHyt + 1 + 1 谢谢@Thanks!
8211059a + 1 + 1 谢谢@Thanks!
JackSmith000 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
y50pro + 1 + 1 我很赞同!
wangyongdesign + 1 + 1 谢谢@Thanks!
homepp + 1 + 1 用心讨论,共获提升!
catoo1 + 1 谢谢@Thanks!
hackerchang + 1 + 1 鼓励转贴优秀软件安全工具和文档!
gon360 + 1 我很赞同!
zjh914 + 1 + 1 用心讨论,共获提升!
RobinMaas + 2 + 1 用心讨论,共获提升!
13143191818 + 1 + 1 热心回复!
cfl300 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
reminiscen + 1 + 1 热心回复!
Haoyua + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
哒劳德 + 1 + 1 我很赞同!
52leexiaoyi + 1 + 1 谢谢@Thanks!
hybcrp + 1 + 1 我很赞同!
wapj152321 + 2 + 1 我很赞同!
大雄1989 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
javid258 + 1 热心回复!
★天若有情★ + 1 + 1 我很赞同!
fycdl + 1 已经处理,感谢您对吾爱破解论坛的支持!
qsj521521 + 1 + 1 谢谢@Thanks!
xiaocai831219 + 1 + 1 谢谢@Thanks!
windsdahlia + 1 + 1 感谢分享 大神厉害!
Shixiaoer + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
shenguoping + 1 + 1 热心回复!
bqi153 + 1 + 1 谢谢@Thanks!
HuaGdao1 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
llzz + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
alexsanda + 1 + 1 谢谢@Thanks!
schtg + 1 + 1 谢谢@Thanks!
zl87012295 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
孤王 + 1 + 1 谢谢@Thanks!
JARK006 + 1 + 1 谢谢@Thanks!
晴天雨过 + 1 + 1 用心讨论,共获提升!
yanglinman + 1 谢谢@Thanks!
cesz123 + 1 + 1 谢谢@Thanks!
LuckyClover + 2 + 1 谢谢@Thanks!
xiao73 + 2 + 1 热心回复!
HelloHi + 3 + 1 用心讨论,共获提升!
海水很咸 + 1 + 1 用心讨论,共获提升!
烛光与香水 + 1 + 1 谢谢@Thanks!
GMCN + 1 + 1 谢谢大佬无私分享
wari01 + 1 + 1 用心讨论,共获提升!
aiqige + 1 + 1 谢谢@Thanks!
八爪印 + 1 + 1 谢谢@Thanks!
xzqabcok + 1 谢谢@Thanks!
msnan + 1 谢谢@Thanks!
onlyclxy + 3 + 1 鼓励转贴优秀软件安全工具和文档!
helian147 + 1 + 1 热心回复!
q5236900 + 2 + 1 热心回复!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

helian147 发表于 2024-10-1 21:20
大佬国庆快乐!
看了一遍,好像jbig2格式不支持。

github.com/caj2pdf/caj2pdf
jbig2dec.py解码jbig2格式,  jbigdec.py解码jbig格式

该项目下的jbig2dec.py,  jbigdec.py可以正常调用,只需略加修改,以jbig2dec.py为例(jbigdec.py相同修改)
[Python] 纯文本查看 复制代码
class CImage:
    # 入参修改
    def __init__(self, buffer, width, height, bits_per_pixel):
        self.buffer = buffer
        self.buffer_size=len(buffer)
        # (self.width, self.height,
        #  self.num_planes, self.bits_per_pixel) = struct.unpack("<IIHH", buffer[4:16])
        # 修改
        self.width = width  
        self.height = height
        self.bits_per_pixel = bits_per_pixel
        
        self.bytes_per_line = ((self.width * self.bits_per_pixel + 31) >> 5) << 2

    def DecodeJbig2(self):
        out = create_string_buffer(self.height * self.bytes_per_line)
        width_in_bytes = (self.width * self.bits_per_pixel + 7) >> 3
        # decode_jbig2data_c(self.buffer[48:], self.buffer_size-48, out, self.width, self.height, self.bytes_per_line, width_in_bytes)
        # 修改
        decode_jbig2data_c(self.buffer, self.buffer_size, out, self.width, self.height, self.bytes_per_line, width_in_bytes)
                
        return out

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
hzxs520 + 1 + 1 我很赞同!

查看全部评分

我识故人兮 发表于 2024-11-25 21:55
啥也不说了,楼主就是给力!必须要支持一下啊
树下彩虹025 发表于 2024-10-14 13:06
很不错的小工具,百度云+B站教程,考虑周到,B币给足。
sdieedu 发表于 2024-10-1 21:01
大佬 国庆节快乐
 楼主| 不谙世事的雨滴 发表于 2024-10-1 21:24
helian147 发表于 2024-10-1 21:20
大佬国庆快乐!
看了一遍,好像jbig2格式不支持。

感谢提出建议,后续我再看看还有什么值得加入的格式,到时候找时间统一合并进去
msnan 发表于 2024-10-1 21:26
非常感谢分享。
fxfxs 发表于 2024-10-1 21:44
谢谢分享,下载备用
189678 发表于 2024-10-1 21:46
感谢提供,收下留存
WCCW 发表于 2024-10-1 21:48
谢谢分享
博爵 发表于 2024-10-1 21:55
这个格式没用过,感谢分享
wari01 发表于 2024-10-1 22:00
国庆节,大佬们还在为爱发电。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-12 12:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表