0

カメラから取得した有効な jpeg フレームがあります。

http://www.developerinabox.com/test.jpg

これを以下の(例)コードでロードしています:

using System.Net;
using System.Drawing;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            WebRequest req = WebRequest.Create("http://www.developerinabox.com/test.jpg");
            req.Timeout = 5000;
            WebResponse resp = null;


            resp = req.GetResponse();
            if (resp != null)
            {
                var s = resp.GetResponseStream();
                if (s != null)
                {
                    Image img = Image.FromStream(s); //<-- Error thrown here
                }
            }


        }
    }
}

Windows XP/Vista/7 では問題なく動作します。

Windows 8 では、「gdi+ の一般的なエラー」で失敗します。同じ結果で WPF 経由で読み込もうとしました。

Windows 8 PC の Google Chrome では画像を表示できますが、IE では表示できません。Windows XP/Vista/7 の両方で表示されます。

Fireworks の Windows 8 ボックスで開くことができますが、ペイントで開こうとすると、次のようになります。

「これは有効なビットマップ ファイルではないか、その形式が現在サポートされていません。」

何か案は?

4

1 に答える 1

3

実際には、これは無効な JPEG 画像ですが、ご覧のとおり、多くのアプリケーションでこの画像をシームレスにデコードできます。この JPEG 画像には偽の SOS マーカーがあります (技術情報で申し訳ありません)。このスキャン ヘッダー(SOS) は、この画像には 1 つの色成分があると述べていますが、フレーム ヘッダー(SOF、JPEG ファイル構造で SOS の前に表示されます) は次のように主張しています。3成分画像です。

そのため、Scan ヘッダーには必要な情報よりも少ない情報が含まれていますが、欠落している情報はデフォルト値に置き換えることができ、JPEG 画像は問題なくデコードされるはずです。これはまさに起こっていることです。不足している情報はハフマン テーブル インデックスであり、これらのインデックスの既定のセットは、JPEG コーディング タイプ (シーケンシャル、プログレッシブ、またはロスレス) に基づいて想定できます。

うーん、JPEGのデコードに関してはWin8の方が厳しいみたいですね。興味がある場合は、別の JPEG 関連の問題 (VB.NET でコード化されています) のためにアップロードしたこのコードを見て、デバッグして問題の場所を知ることができます (JPEG の仕様も確認する必要があります)。


編集: 結局、有効なJPEG画像でした

この JPEG はベースラインのマルチスキャン シーケンシャルイメージ (平面イメージに似ています) であり、プログレッシブイメージ (インターレースイメージに似ています) と混同しないでください。画像は一度に 1 つのコンポーネントでデコードされるため、この JPEG のスキャン ヘッダーは小さくなります。したがって、このファイルには 3 つの不連続なスキャン ヘッダー( SOS for 1st component, compressed data, SOS for 2nd component, compressed data,...) があり、各スキ​​ャンヘッダーには 1 つのコンポーネントの情報が含まれています。
最後に、問題が不完全または偽のスキャン ヘッダーである場合、回避策があります (偽の SOS ヘッダーを修正できます) が、そうではありません。したがって、MS 担当者にサポートを求めるリクエストを行うことができます。Win8 での連続した JPEG 画像のマルチスキャン;-) またはサードパーティの JPEG デコーディング ライブラリを使用します。

于 2012-11-01T03:28:37.510 に答える