0

TIFF を PDF に変換しているときに、一部の PDF が破損していることに気付きました。いくつかの調査の後、問題は System.Drawing.Image クラスにあるようです。これをテストするために、PDF に変換する代わりに、プログラムに画像ファイルを読み込んで再保存してもらいました。新しく保存されたファイルの中には、プログラムの異なる実行間でファイル サイズが一致しないものがあります。基本的な手順は次のとおりです。

  1. TIFF イメージをバイト配列に読み込みました。
  2. System.Drawing.Image.FromStream() メソッドを使用して、バイト配列からイメージ オブジェクトを作成します。
  3. 次に、System.Drawing.Image.Save(stream) メソッドを呼び出して、画像を新しいストリームに保存します。
  4. 次に、stream.ToArray() メソッドの長さを調べます。

同じ入力ファイルでも、連続するプログラムの実行間で出力の長さが異なります。出力の長さは数百バイト異なります。さらに、結果として得られる出力の長さは入力の長さの 2 倍以上になりますが、これは圧縮または圧縮不足によるものだと思います。私は.net 4を搭載したWindows 7 32ビットでこれを実行しています。

出力の長さがこのように異なるのはなぜですか?

アップデート:

この接続の問題 ( https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and-windows-7 ) とこの MSDN ページ ( http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx ) のコミュニティ コメントによると、この問題は Windows 7 のオペレーティング システム レベルのバグに関連しているようです。誰でもこれを確認したり、回避策を提供したりできますか?

4

2 に答える 2

1

Windows 2008 サーバーの 64 ビットでも同様の問題が発生します。同じ TIFF をロードして再度保存すると、実行ごとに異なるファイルが生成されます。そのため、Windows 7 に固有のものではないと思います。それを示すために、次の C# プログラムを作成しました。

for (int i = 0; i < 2000; i++)
            {

                sourceToConvert = Bitmap.FromFile("c:\\tmp\\png\\zip\\fig_AAAW_6.tif");
                sourceToConvert.Save("c:\\tmp\\png\\fig_AAAW_6_regen.png", ImageFormat.Png);

                if (!CompareFileBytes("c:\\tmp\\png\\fig_AAAW_6_gen.png", "c:\\tmp\\png\\fig_AAAW_6_regen.png"))
                    MessageBox.Show("Diff" + i);                
            }

これにより、反復 8、32、33、73、114、155、196、... で 'Diff' が表示されますが、x86 ターゲット CPU でコンパイルすると、32 ビット マシンでまったく同じファイルが生成されます。64 ビット ターゲットを使用すると、さらに悪化します。反復 12、13、14、15、... でファイルが異なります。

.

于 2012-05-14T15:22:17.080 に答える
0

私の更新で述べたように、この接続の問題を確認した後 ( https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and- windows-7 ) およびこの MSDN ページ ( http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx ) のコミュニティ コメントによると、問題はオペレーティング システムに関連しているようです。 Windows 7 のレベルのバグ。

さらに、Windows XP で画像を読み込むと、画像オブジェクトの flags プロパティは 77888 に設定されます。Win7 では、77840 に設定されます。フラグ プロパティに関する MSDN ドキュメントを確認した後 ( http://msdn.microsoft .com/en-us/library/system.drawing.image.flags.aspx )、違いは、WinXP は画像にグレースケール画像としてフラグを立てたが (私の場合)、Win7 は RGB 画像としてフラグを立てたことです。これは問題の症状のようですが、私は画像フォーマットと色空間について十分に知りません。

于 2012-02-01T15:06:30.570 に答える