Windows 照片查看器因内存不足而无法运行?

Windows 照片查看器因内存不足而无法运行?

刚刚收到一个奇怪的错误。我通过电子邮件收到了一张图片,在 Outlook(Office 365 版本)中打开了该电子邮件,然后双击图片将其打开。我收到此错误:

“Windows 照片查看器无法显示此图片,因为您的计算机可能没有足够的内存。请关闭一些不使用的程序或释放一些硬盘空间(如果快满了),然后重试。”

在此处输入图片描述

几点:

  • 我一直使用这台笔记本电脑上的照片查看器,之前没有遇到过问题。我重新启动并尝试再次打开图片,但没有成功。
  • 图像没有损坏。我保存到桌面,尝试打开,同样的问题。我用 Photoshop 打开,效果很好。我将其从 PSD 保存为新的 JPG。新的 JPG 也显示相同的消息。
  • 我尝试打开的任何图像都会导致此错误。
  • 该图像大小为 200KB,分辨率为 1428x2000。
  • 我的笔记本电脑有 32GB 的 RAM,根据任务管理器显示,目前使用了 8GB。

我尝试过的:

来自微软的这篇文章:https://social.technet.microsoft.com/Forums/windows/en-US/7b6ae08b-4b5c-443b-9d43-e87ca5e7aeb1/wndows-photo-viewer-operation?forum=w7itproappcompat

  • 这不起作用,因为当我进入色彩管理时,我没有设置配置文件,所以我无法删除。

我看过这个帖子:Windows 照片查看器需要更多内存吗?

  • 我有 2 个内置显卡:标准 Intel(R) HD Graphics 530 和 Nvidia Quadro M1000M。我尝试了帖子中的分辨率(将其移动到由不同显卡驱动的不同显示器),但没有任何变化。

磁盘清理。本来就有足够的剩余空间,但什么都没改变。

规格:我在联想 P50 笔记本电脑上运行 Windows 10 v1909 Build 18363.535,配备 32GB 内存、500GB 存储空间(目前可用 192GB)、Intel Core i7-6700HQ。

如果有人能帮助解决这个问题,我将不胜感激。新的 Microsoft Photos 应用程序实在太糟糕了,我会不惜一切代价避免使用它。

答案1

我之所以遇到这个问题,是因为我从 Android 导出照片时也遇到了类似的问题发送折扣免费应用。

就我的情况而言,这个问题与以下方面有关:简介-icc在那个 JPG 文件中。

  Profiles:
  Profile-icc: 536 bytes

可以通过以下方式验证ImageMagick 识别-详细命令。

这可能不是直接从 Outlook 打开它的解决方案,但您可以在源中修复该文件。

我发现当我跑步时转换 BADFILE.jpg -删除 GOODFILE.jpg该文件上的命令可以在 Windows 7 照片查看器中毫无问题地打开。

-strip  - strip image of all profiles and comments

您可以在这里获取整个工具:https://imagemagick.org/script/download.php

因此,如果您想让所有图像再次可访问,只需对它们运行批处理:

mogrify.exe -format jpg -verbose -path C:\OUTPUT_DIR -strip *.jpg

也可能使用相对路径,例如-路径输出目录如果您希望它们位于子文件夹中。

如果您必须直接从 Outlook 打开该文件,我建议您使用 IrfanView,它打开该文件没有问题。只需将其设置为默认图形文件程序即可。

有些人建议做一些与更改屏幕配置中的默认配置文件有关的事情,但我已将其设置为我的显示器类型,所以我不想弄乱这些设置。

如果你想要全自动,你需要 3 样东西:

  1. 默认程序编辑器(https://defaultprogramseditor.com/
  2. ImageMagick(https://imagemagick.org/download/binaries/ImageMagick-7.0.10-1-portable-Q16-x64.zip
  3. 将处理打开的文件的批处理脚本。

1)首先将ImageMagick解压到c:\apps\ImageMagick-7.0.10-1-portable-Q16-x64

2)创建批处理脚本c:\应用程序\gfxopen.bat

@echo off
C:\Apps\ImageMagick-7.0.10-1-portable-Q16-x64\convert.exe %1 -strip c:\temp\temp12345file.jpg

rundll32 "C:\Program Files\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen c:\temp\temp12345file.jpg

del c:\temp\temp12345file.jpg

3)解压缩默认程序编辑器并运行它,然后选择文件类型设置 > 上下文菜单 > 找到 jpg 扩展名,然后 > 添加...

命令名称:Open Fixed Image

程序路径:"C:\apps\gfxopen.bat" "%1"

然后选择“打开固定图像”并按“将选定的命令设置为默认值”

然后保存上下文菜单

就这样 :)

答案2

我遇到了同样的问题并按照简单的步骤解决了它:

  • 使用 Notepad++ 或任何其他类似的十六进制编辑器打开图像文件。
  • ICC_PROFILE在文本中查找并替换为ICC_PROFILX(通常在文件的第一行文本)
  • 保存编辑后的文件。就这样!

在此处输入图片描述 在此处输入图片描述

答案3

在 Windows 开始菜单搜索框中输入color并打开Colour Management

“颜色”开始菜单搜索

然后转到Advanced选项卡并Agfa:Swop Standard选择Device Profile

色彩管理屏幕

答案4

对于任何可能遇到此问题的 Android 开发人员:似乎 Windows 照片查看器不喜欢Bitmap.compress写入的 ICC 配置文件元数据(也许它不喜欢任何ICC 配置文件实际上是?我还没有检查过。

这是一种从 JPEG 文件中删除元数据段的简单方法,它可以生成与 Windows 照片查看器再次兼容的 JPEG:

    // Some image viewer applications (such as Windows Photo Viewer) doesn't seem to like the ICC profile meta data that Android's Bitmap.compress writes.
    // This decorator removes the section.
    private static class RemoveFFE2OutputStreamDecorator extends OutputStream {
        OutputStream underlyingStream;
        boolean marker = false;
        boolean skipSegment = false;

        public RemoveFFE2OutputStreamDecorator(OutputStream underlyingStream) {
            this.underlyingStream = underlyingStream;
        }

        @Override
        public void write(int b) throws IOException {
            // Based on https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure
            if (this.marker) {
                this.marker = false;
                if ((b & 0xFF) == 0xE2) { // The 0xFF,0xE2 segment that Android writes seems to cause trouble with Windows Photo Viewer.
                    this.skipSegment = true;
                } else {
                    this.skipSegment = false;
                    this.underlyingStream.write(0xFF);
                    this.underlyingStream.write(b);
                }
            } else if ((b & 0xFF) == 0xFF) {
                this.marker = true;
            } else if (!this.skipSegment) {
                this.underlyingStream.write(b);
            }
        }

        @Override
        public void flush() throws IOException {
            this.underlyingStream.flush();
        }

        @Override
        public void close() throws IOException {
            this.underlyingStream.close();
        }
    }

相关内容