吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3133|回复: 132
上一主题 下一主题
收起左侧

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

    [复制链接]
跳转到指定楼层
楼主
不谙世事的雨滴 发表于 2024-10-1 20:57 回帖奖励
本帖最后由 不谙世事的雨滴 于 2024-10-4 09:27 编辑

【10月4日】:
紧急通知!
各位,如果你日常登录和使用的Windows账号
不是系统内建的默认管理员账户:Administrator
请暂时不要下载使用此软件
我正在研究完善:UAC绕过、提升权限,以及进程重复的判断机制,到时候完善好了会通知各位更新的



写这款工具之前,本人一直饱受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虚拟机上的软件运行截图如下:




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












简介:这是一款可以将各种常见图片格式,转换为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图片,这也可能是我的测试样本不够多的原因。
此外,pillow和pillow_heif这两个库属于是知名的python库,一直处于不断有人维护更新的状态,相比很久以前就停止维护的“HEIF Utility,不得不说更让人期待。


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


(4)整个转换过程中,除非额外调用专业工具exiftool转移exif(这个工具需要现成的文件作为参数输入),单个文件的转换过程中能做到【接近一次读取(不确定因素是Windows的“Memory Mapped File”的加速机制是否一次将文件全部加载到内存) + 一次写入】的磁盘操作,尤其是对LIVP、PDF、华为动态图片这些“打包图片”的格式,对其中的图片都能做到“一次读取、在内存中转换、然后将最终结果一次性写入输出文件”,没有:“先解压/解包到磁盘文件,然后再在解包出的磁盘文件上读取再转换,最后删掉或者覆盖掉解包出的磁盘文件”这种多余的磁盘读写操作
这也是我仔细研究过各个库的API文档后,才能优化到现在这个样子,尤其是livp(实际上是基于zip压缩包的),网上的转换代码大都是先解压zip到磁盘文件,然后再进行转换操作的。


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


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


(4)和(6)的优势使程序对机械硬盘非常友好,可以放心地处理位于机械硬盘上的照片,而不用担心产生额外的读写动作和文件碎片。
此外,程序还考虑到了调用exiftool对文件覆写产生的碎片,默认设置下,如果文件位于机械硬盘(程序支持自动识别磁盘的硬件类型),且转换过程中调用了exiftool,程序将自动整理产生的碎片,使最终的输出文件没有碎片。


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


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






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


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


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


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


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


(5)【cairosvg】:
SVG


(6)【pymupdf】:
PDF


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


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




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




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


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






OK,哔哔了这么多,该放链接了!

教程、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



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


有些遗憾的地方除了上面说到的不支持.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,最后祝各位观众姥爷国庆假期快乐哈~

免费评分

参与人数 48吾爱币 +59 热心值 +45 收起 理由
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 我很赞同!

查看全部评分

3#
sdieedu 发表于 2024-10-1 21:01
4#
xbbymcom 发表于 2024-10-1 21:22
5#
 楼主| 不谙世事的雨滴 发表于 2024-10-1 21:24 |楼主
helian147 发表于 2024-10-1 21:20
大佬国庆快乐!
看了一遍,好像jbig2格式不支持。

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

本版积分规则

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-10-7 15:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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