IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Windows11 Photos无法打开jpg图片

    obaby发表于 2024-04-22 13:20:12
    love 0

    这个问题由来已久,其实在很早之前就发现这个问题了。但是一直也没想到怎么解决这个问题,昨天晚上查看图片的时候,这个问题又出现了。比较奇怪的是把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)。

     



沪ICP备19023445号-2号
友情链接