2
Bitmap clip = new Bitmap((int)(8.5 * 72), (int)(11 * 72));
MemoryStream stream = new MemoryStream();
clip.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
byte[] bytes = stream.ToArray();

私はそれを自分のマシンで実行しましたbytes.Length8587、仲間の開発者のマシンでは でした2009。おそらく.NET、PNG圧縮の品質(この場合は比率)に影響を与える方法はありません。この特定の画像は空白の画像であり、コンテンツを含む画像で動作する他のテストがあり、圧縮がロスレスであることを確認しています(それが問題であるいくつかの議論に遭遇しました).

ただし、圧縮がロスレスであっても、圧縮アルゴリズムの実行時間 + CPU 使用率と圧縮率 / 品質の間にはトレードオフがあります。System.Drawing.Imagingこの上記のケースは、違いがある可能性があることを明確に示しているため、品質をどのように決定するのだろうか。クライアントのマシンで 100% の品質 (1.457.337 サイズのファイルが生成される) が選択されないようにするにはどうすればよいですか?

関連資料:

追加情報:

  • 別の開発者のマシンをチェックアウトしたところ、他の同僚の結果と一致していたので、私のマシンは外れ値です。
  • 各マシンには Win 7 Prof 64 ビットがインストールされており、特定のテストは NUnit であり、.NET 4 を使用しています。
  • この点で、インストールしたソフトウェアのいずれかが .NET の動作をオーバーライドすることはできますか? たとえば、IrfanView をインストールしましたが、システム全体の「フィルター」または使用されている dll を置き換えることができますか? (ところで、モジュールのデバッグ ビューをチェックインしましたが、異常な dll がロードされていません)
  • 一部の Windows OS デスクトップの品質設定などの影響を受ける可能性はありますか?
4

2 に答える 2

7

私はこの問題を正確に追跡してきましたが、2 台のマシンであなたとまったく同じ結果が得られました。2 台のマシンで異なるバージョンの System.IO.Compression.DeflateStream まで追跡したと思います.png は圧縮方法として deflate を使用し、このクラスを使用しているようです。

次を実行すると:

byte[] blank = new byte[1000000];
MemoryStream uncstream = new MemoryStream(blank);
MemoryStream compstream = new MemoryStream();
DeflateStream defstream = new DeflateStream(compstream, CompressionMode.Compress);
uncstream.CopyTo(defstream);
defstream.Close();
byte[] bytes = compstream.ToArray();
System.Console.WriteLine(bytes.Length);

あるマシンでは 985 バイト、別のマシンでは 8806 バイトになります。

コンストラクターを次のように変更した場合:

DeflateStream defstream = new DeflateStream(compstream, CompressionLevel.Optimal);

最初のマシンで同じ結果が得られ、2 番目のマシンでは実装されていない例外が発生しました。これは、以前のバージョンの圧縮ライブラリを使用していることを示しています。2 台目のマシンで System.IO.Compression.dll を検索すると、.Net 4 がインストールされているはずなのに、まったく見つかりません。.Net 2.0 のどこかに隠されていると思います。私は、MS が .Net のバージョン 2 と 4 の間で DeflateStream を改善したと主張していることを知っています。議論については、こちらを参照してください。

http://www.virtualdub.org/blog/pivot/entry.php?id=335

これが正しいかどうかはわかりませんが、別の圧縮 dll が .Net 4.5 で開始されたと言われていることも確認しました。私の次のステップは、2 番目のマシンに .Net 4.5 をインストールして違いがあるかどうかを確認することですが、それは 1 月にオフィスに戻るまで待つ必要があります。

于 2013-12-29T03:21:04.213 に答える
1

.NET Framework のさまざまな更新プログラムがインストールされている可能性があります。

これに従って確認してください:http://msdn.microsoft.com/en-us/library/hh925567.aspx

.NET Framework 4 のさまざまな "ディストリビューション" がある場合もあります。

  • クライアントプロフィール
  • 拡張
  • マルチターゲティングパック

同じ方法で確認できます。

于 2013-10-10T21:50:01.480 に答える