大家都是如何處理錯誤的圖片副檔名?

如題,最近打算整個大活,把大量的圖片都轉換成 JXL 格式
前置工作都準備好了,但是碰到一個神奇的問題

就是有一些圖片,比如說jpg,因為某些人為/非人為 因素
導致它的副檔名被命名為不相符的格式,例如 png
這影響了轉檔工程,產生了不可預料的錯誤

有沒有什麼大批量、自動化的檢測、修復軟件
可以去偵測這些副檔名錯誤的圖片,將它修正成正確的格式呢?

目前已知有幾種方法,但都各有利弊
例如某些github項目 identify、 Fast Image Integrity Checker
它們缺少 gui 的版本,操作複雜,效率也不夠好

還有 irfanview ,一個圖片瀏覽器
但是自帶一個檢測副檔名並修正的奇葩功能
不過使用它意味著得放棄偏好的圖片瀏覽器
而且無法批量、自動的修復問題,只能看一個是一個

不知道大家遇到這種問題都是怎麼解決的呢?

注:微软官网中,file name extensions的简中翻译为“文件扩展名”,而繁中翻译为“档案副档名”
例如picture.png的文件扩展名(档案副档名)为png

2 个赞

我的建议是编写一个Python脚本,先检测修改源文件的后缀,再后续处理,脚本很简单,用pillow等现成的库就行,不会写,让gpt帮你

1 个赞

感謝補充

常见格式的文件头几个字节,是有固定的部分(特征),
写个程序读这些特征,与扩展名对应的特征不一致的文件,就是需要改扩展名的

我有重新發明輪子的體質
這種事常常發生在我努力動手豐衣足食之後

有一次找了某些軟件超過3個月,確定沒有現成品能用之後
花了一個禮拜左右把軟件寫出來,結果寫完的隔天
都放棄尋找了,居然就在某個管道,目標軟件自己跳了出來
真的是氣到想砸電腦

您说的对,依据此,我们应该可以快速地写出一个脚本之类的东西,以来辅助完成文件扩展名校准的任务
在此之前,贴主可以先搜索是否有依据文件头将不同格式图片转jxl的工具

嗯…所以我在开始新工程之前总是会估计并权衡以下两个参数(下面“资源”指代时间、金钱、精力等)
1,搜索所需软件所花的资源
2,创建所需软件所花的资源
只有1大于2时,新工程才会继续
我管这个操作叫“可行性验证”,上面两个参数的检查是所有可行性验证步骤中的第三步

这个有智能分析文件获取扩展名的功能,我没使用过该功能,应该是可行的

1 个赞

https://wwgz.lanzouw.com/b00mowixja
密码:gon2
pecmd写的小工具,把rep.ini拖到pecmd.exe上面运行,程序会遍历rep.ini所在的文件夹及其所有子文件夹中的所有文件,并尝试与已知文件头匹配。若成功匹配,则会重命名文件为相应的扩展名

rep.ini是源码(没有电脑,用手机写的,排版有点乱不要在意)
源码大部分来自我鸽了好久的一个工程
FastBall

1 个赞

測試成功! (放煙火 :boom:

用手機編程聽起來還是挺cyber的…

額外問題
rep.ini 改名使用會有影響嗎?

1 个赞

理论上没有

另外,因为我经常在纸上写代码,所以其实有能编辑文本的东西就能写程序

另外一,命令行pecmd.exe load rep.ini(此处可以替换为任意合规的ini完整路径)可以启动这个程序

另外二,pecmd.exe包含了这个脚本解释器的一切功能——包括开发文档,所以您也可以任意修改

另外三,请教一下,cyber是什么意思(好奇),搜到的意思不大符合当前语境…

另外四,很高兴能够帮助到您!

1 个赞

這個詞的中文是賽博 ,取自 賽博龐克(Cyberpunk)裡的cyber
意思是數位的(電腦、網路等的集合概念)
文化語境上的習慣用法是表示 很未來的
白話來說,就是我覺得你用手機編程挺酷的,很有未來範兒

2 个赞

看到這句話真的感觸良多,想起高中第一次接觸編程

學校剛教完hello world ,要接著教排序和寫出一個簡易計算機的時候

那時我國中的摯友(今天依然是)構思出了一種獨特的加密方式

我看完之後的隔天,就開始翻閱學校的教材工具書
用一張A4廢紙的背面,開始手寫代碼

一回家,花了3小時的試錯後,就把加密軟件做了出來
上傳給我的摯友看,他沉默了一分鐘後,回了
哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇!!!
我感覺成就感滿溢而出,就像剛學會爬就成功飛了起來

不過我的心性不行,經歷太多重造輪子的負面事件後
感覺自己變成了編程鹹魚…

得益於您的邏輯思維,我看了 rep.ini 的內容後茅塞頓開
感覺又上了一課,看到代碼之前確實沒有去認真了解過圖檔結構
不斷把尋找目標軟件的難度 施加到編程的預期難度上…
事情反而被自己變的複雜、困難了

再次感謝,往後會先認真評估創建軟件的實際成本的

1 个赞

很荣幸能够帮助到您
话说回来,我明年也要上高中了——今年我初三,希望到时候可以拥有更棒的脑子来开发
羡慕您和您的好朋友的友情!

2 个赞

实际遇到过,所以直接写了一个py来解决
需要先“pip install pillow”

real_pic_suffix


import os
from PIL import Image
import io

# 需要的依赖
# pip install pillow

# 设定要检查的图片格式
SUPPORTED_FORMATS = {
    "JPEG": "jpg",
    "PNG": "png",
    "WEBP": "webp"
}

def is_image_file(filename):
    # 只处理设定的图片格式
    valid_extensions = {"jpg", "jpeg", "png", "webp"}
    return filename.split(".")[-1].lower() in valid_extensions

def check_image_format_and_extension(root_dir):
    for dirpath, _, filenames in os.walk(root_dir):
        for filename in filenames:
            if not is_image_file(filename):
                # 跳过非图片文件
                continue
            
            file_path = os.path.join(dirpath, filename)
            file_extension = filename.split(".")[-1].lower()

            try:
                # 读取文件并加载到内存中来检测图片格式,不然一会儿改名时文件会被占用
                with open(file_path, "rb") as file:
                    image_data = io.BytesIO(file.read())

                with Image.open(image_data) as img:
                    actual_format = img.format
                    if actual_format in SUPPORTED_FORMATS:
                        actual_extension = SUPPORTED_FORMATS[actual_format]
                        if actual_extension != file_extension:
                            # 使用临时文件名.temp来避免重命名冲突
                            temp_file_path = file_path + ".temp"
                            os.rename(file_path, temp_file_path)
                            correct_file_path = temp_file_path.rsplit(".", 2)[0] + "." + actual_extension
                            os.rename(temp_file_path, correct_file_path)
                            print(f"已将文件 {file_path} 重命名为 {correct_file_path}")
                        else:
                            print(f"文件 {file_path} 的格式与后缀名匹配")
                    else:
                        print(f"文件 {file_path} 的格式 {actual_format} 不支持")
            except Exception as e:
                print(f"处理文件 {file_path} 时出错: {e}")

if __name__ == "__main__":
    # 获取当前.py文件所在目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    print(f"正在检查文件夹: {current_dir}")
    check_image_format_and_extension(current_dir)

1 个赞

後生可畏阿!

現在的初三生就這麼厲害了,中國的編程實力變得更加深不可測的同時
也是後繼有人了! :doge:
最後祝福您的開發之路能夠蒸蒸日上,技術力爐火純青 :+1:

1 个赞

我的话,就直接在ubuntu写个sh脚本就行,就是遍历文件夹下所有图片格式后缀的文件名,拿文件名给 file 命令(例如$ file -b xx.jpg)对比识别输出结果,若后缀名不符输出结果就重命名后缀名。就是要注意 file 命令可能会无法识别较新的图片格式。把上面这段话交给gpt应该就有sh代码了

不少批量重命名软件都有这功能,如楼上的菲菲,还有Renamer

一般我也推荐 菲菲更名宝贝 的.

另外 有个非常牛逼的工具, 叫做 TrID

它的数据库 已包含18433 种文件类型 . 而且会定期更新.

利用这个软件的命令行参数 -ae 或者 -ce, 也是可以实现根据文件类型自动更名的.

使用参数 -ae 将 TrID 猜测的扩展名添加到文件名中。

C:\TrID>trid c:\temp\* -ae

 TrID/32 - 文件标识符 v2.24 - (C) 2003-16 由 M.Pontello 编写          
 找到的定义:5702
 分析中…

 文件:c:\temp\FILE0001.CHK
  75.8% (.BAV) The Bat! 防病毒插件 (187530/5/21)

 文件:c:\temp\FILE0002.CHK
  77.8% (.OGG) OGG Vorbis 音频 (14014/3)

 文件:c:\temp\FILE0003.CHK
  86.0% (.DOC) Microsoft Word 文档 (49500/1/4)

 文件:c:\temp\FILE0004.CHK
  42.6% (.EXE) UPX 压缩的 Win32 可执行文件 (30569/9/7)

  4 个文件已重命名。

此时,c:\temp 文件夹中的文件将如下所示:

FILE0001.CHK.bav
FILE0002.CHK.ogg
FILE0003.CHK.doc
FILE0004.CHK.exe

相反,开关 -ce 只会将文件扩展名更改为新的扩展名;如果文件没有扩展名,则会添加新的扩展名。例如:

IAmASoundFile.dat → IAmASoundFile.wav
IAmABitmap → IAmABitmap.bmp

利用这个, 我给自己的Doups 增加了一个更名命令.

2 个赞