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。我已經嘗試過帖子中的分辨率(將其移動到由不同顯示卡供電的不同顯示器),但沒有任何變化。

磁碟清理。無論如何,有足夠的空閒空間,但沒有任何改變。

規格:我在一台 Lenovo P50 筆記型電腦上執行 Windows 10 v1909 Build 18363.535,配備 32GB 記憶體、500GB 儲存(目前有 192GB 可用空間)、Intel Core i7-6700HQ。

如果有人可以幫助解決這個問題,我們將不勝感激。新的微軟照片應用程式絕對是糟糕的,我會不惜一切代價避免使用它。

答案1

我發現這個問題是因為我在處理從 Android 匯出的照片時遇到了類似的問題減少免費發送應用。

在我的案例中,這個問題與包含在內有關簡介-icc在該 JPG 檔案中。

  Profiles:
  Profile-icc: 536 bytes

可以透過以下方式驗證ImageMagick 辨識 -verbose命令。

這可能不是直接從 Outlook 打開它的解決方案,但您可以在來源中修復該檔案。

我發現當我跑步時轉換 BADFILE.jpg -strip 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

也可能使用相對路徑,例如-路徑 OUTPUT_DIR如果您希望它們位於子資料夾中。

如果您必須直接從 Outlook 開啟該文件,我會推薦例如 IrfanView,它在開啟該文件時沒有問題。只需將其設定為預設圖形檔案程式即可。

有些人建議與更改螢幕配置中的預設設定檔相關的內容,但我將其設定為我的顯示器類型,因此我不想弄亂該設定。

如果你想要全自動,你需要三件事:

  1. 預設程式編輯器(https://defaultprogramseditor.com/
  2. 圖像魔術師(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:\apps\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();
        }
    }

相關內容