这个问题由来已久,其实在很早之前就发现这个问题了。但是一直也没想到怎么解决这个问题,昨天晚上查看图片的时候,这个问题又出现了。比较奇怪的是把jpg改成jpeg就能正常显示了,但是实际上这两个文件格式是一样的,就是扩展名不同而已。
具体的表现就是下面的样子:
点击图片打开之后,窗口无法正常拖拽,全屏之后无法重新渲染,并且有的图片打开之后非常模糊。
昨天晚上还在考虑是不是跟分辨率或者缩放有关系。
今天搜索了以下,发现这个问题貌似是个通病:https://cn.bing.com/search?q=windows+11+photos+open+jpg&form=QBLHCN&sp=-1&lq=0&pq=windows+11+photos+open+jpg&sc=10-26&qs=n&sk=&cvid=64CC0D0560E047778DF11DB09CB7BFBC&ghsh=0&ghacc=0&ghpl=
搜索之后发现了另外一个问题,就是网上竟然有各种jpg图片的修复工具,按照我浅薄的理解,这个图片修复如果是数据有问题,那么所有的图片查看工具应该都会失败,或者打开不开,但是使用picasa这种工具是完全可以正常浏览的,那么问题来了,这种工具修复的是什么?
发现了这一点之后,我依然怀疑图片本身是没问题的,那么出问题的还是photos,对于图片的解析有问题,很有可能虽然扩展名是jpg,但是实际上格式不是jpg,而改成jpeg,正好photo的文件解析阴差阳错的给处理对了。
下面就是证实想法的时候了,打开图片发现,文件头为webpv8:
正常的jpg:
webp文件头:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 'R' | 'I' | 'F' | 'F' | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | File Size | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 'W' | 'E' | 'B' | 'P' | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
知道问题的原因,那么要解决也就简单了。批量将文件的扩展名改成正确的就ok了。
直接通过python + pillow来实现是最简单的,直接上代码吧:
import pathlib
from PIL import Image
import os
from pathlib import Path
import hashlib
import shutil
from pyfiglet import Figlet
source_file_paths = [
Path(r'E:\Pycharm_Projects\image_extened_name_tool\test_images'),
]
def print_hi(name):
# Use a breakpoint in the code line below to debug your script.
print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.
def print_hack():
print('*' * 100)
# f = Figlet(font='slant')
f = Figlet()
print(f.renderText('obaby@mars'))
print('图片格式探测重命名工具 V1.0')
print('Verson: 24.04.22')
print('Blog: http://www.h4ck.org.cn')
print(' http://nai.dog')
print('*' * 100)
def get_image_format(file_path):
image = Image.open(file_path)
# 返回大写的图片格式
return image.format.lower()
def rename_images_in_dir(p):
global done_paths
print('=' * 200)
print('[M] 开始处理目录' + p.name + ' ......')
for dir in p.iterdir():
if dir.is_dir():
for img in dir.glob('*.*'):
ext = get_image_format(img)
if img.suffix != '.'+ ext :
# image_name = img.name
# shutil.delete(img)
old_name = img.name
try:
img.rename(img.with_suffix('.'+ ext ))
except :
pass
print('[*]' + old_name + ' 修改为:' + img.with_suffix('.'+ ext ).name )
print('[*]' + dir.name + ' 目录处理完成')
print('-' * 200)
else:
ext = get_image_format(dir)
if dir.suffix != '.' + ext:
# image_name = img.name
# shutil.delete(img)
old_name = dir.name
try:
dir.rename(dir.with_suffix('.'+ ext ))
except Exception as e:
# pass
print(e)
print('[*]' + old_name + ' 修改为:' + dir.with_suffix('.'+ ext ).name)
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print_hack()
# print_hi('PyCharm')
# ext = get_image_format(r'F:\秀人集\[XiuRen秀人网]No.8319_模特合集女神豆瓣酱私房性感姐妹花灰色蕾丝内衣完美诱惑写真81P\0b6350db47878a9c3a0e2b4a9370d099.jpg')
# ext = get_image_format(r'F:\xrmnw\[LeYuan星乐园]Vol.015_美女主播酸酱兔吊带背心秀美胸黑色蕾丝内裤诱惑写真47P\1a82e08cf99610433c061273f855d8db.jpg')
# print(ext)
print('*' * 100)
print('[S] 开始处理图片:')
for p in source_file_paths:
rename_images_in_dir(p)
print('[D] 所有目录完成清理。请欣赏图片吧。')
print('*' * 100)
批量处理之后,photos就可以正常工作啦,妈妈再也不用担心这个破玩意儿卡死啦(粗略猜测网上的各种修复工具可能也是类似的原理,这个东西包装一层效果就不一样了,当然也可能是直接把webp又给转成了jpg)。



28 comments
检查指定文件夹内的所有文件,识别出图片文件后,使用文件的MD5值和图片的实际格式来重命名这些文件,保证文件名与其内容相匹配。👍
差不多就是这个意思~~嘻嘻
厉害啊
雕虫小技而已啦
不明觉厉
找到问题,解决就简单了
佩服姐姐高超水平
雕虫小技而已啦,主要是警察呢遇到就有点恶心,就想着给解决了
win11好多反人类改动,要折腾的
这个按照文件扩展名识别文件,在某些条件下就成了bug。
我昨晚在网上下个图片 webp 格式,结果 Photoshop 都识别不了,我还转了个格式。不过 Windows 是可以查看的
ps 最新的吗?新版的应该是可以识别的。
2022版,我重新找个新版的试试。
人生苦短,我用mac
mac 也有 mac 的问题,😂
早上是我的问题吗,我进不来了,下午又好了
不是的,上午被打了,一直没开战,另外的域名 oba.by 可以正常访问。
增加了几套线路,😂
阿哲😥😥有什么损失吗?我上个月刚建站六七天就被打了,给我流量都干欠费了😭😭😭
损失就是流量费啊~~
import 的换行看得我强迫症都快犯了,哈哈哈̋(๑˃́ꇴ˂̀๑)
哈哈哈,这个还好吧,专门治疗强迫症
有事做了,,,播放器不能全屏,修一修
但是,这个播放器不是我写的啊~~
可惜不是灵妹妹
是个windows11更新bug吗
也不是,是我下载的图片的问题。扩展名不对,webp 给存成 jpg 了
雕虫小技而已啦哈哈哈哈哈。不过会去看文件头,就确实很像程序员的思维。
是哒