4

かなり奇妙なエラーがあります。画像を縮小し、品質を縮小してJPEGに変換する必要があります。これはすべて、ファイルをディスクに保存すると機能しますが、ストリームに保存すると機能しません。

System.Drawing.Bitmap bitmap = // valid Bitmap from Disk
System.IO.Stream stream = new MemoryStream();

// JPEG Encoding

System.Drawing.Imaging.ImageCodecInfo jpgEncoder = GetEncoder( System.Drawing.Imaging.ImageFormat.Jpeg );
System.Drawing.Imaging.Encoder encoder2 = System.Drawing.Imaging.Encoder.Quality;
System.Drawing.Imaging.EncoderParameters parameters = new System.Drawing.Imaging.EncoderParameters( 1 );
System.Drawing.Imaging.EncoderParameter parameter = new System.Drawing.Imaging.EncoderParameter( encoder2, qualityLevel );
parameters.Param[0] = parameter;

// Save downscaled on Disk and stream

bitmap.Save( stream, jpgEncoder, parameters );
bitmap.Save( @"C:\TestJPEG.jpg", jpgEncoder, parameters );

// some stream stuff

var bytes = ((MemoryStream)stream).ToArray();
System.IO.Stream inputStream = new MemoryStream( bytes );

// Load from disk and stream

Bitmap fromDisk = new Bitmap( @"C:\TestJPEG.jpg" ); // works
Bitmap fromStream = new Bitmap( inputStream ); // crash invalid parameter no inner message or description
Bitmap fromStream2 = (Bitmap)Bitmap.FromStream( inputStream ); // same error here
// also crashes if I load the "stream" named Stream

変換したファイルをペイントで開くこともできます。助言がありますか?

編集: Windows7Professionalで.NetFramework4.0を使用しています

Edit2: そのシークを試してみました(回答は削除されました)

stream.Seek( 0, SeekOrigin.Begin );

「古い」ストリームで動作します。しかし、私はそれをバイト配列からロードする必要があります。それでも同じクラッシュ

4

1 に答える 1

2

次のコードは私のために働きます:

var bitmap = new Bitmap(@"c:\Dokumente und Einstellungen\daniel.hilgarth\Desktop\Unbenannt.bmp");

ImageCodecInfo jpgEncoder = ImageCodecInfo.GetImageEncoders().Single(x => x.FormatDescription == "JPEG");
Encoder encoder2 = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters parameters = new System.Drawing.Imaging.EncoderParameters( 1 );
EncoderParameter parameter = new EncoderParameter( encoder2, 50L );
parameters.Param[0] = parameter;

System.IO.Stream stream = new MemoryStream();
bitmap.Save( stream, jpgEncoder, parameters );
bitmap.Save(@"C:\Temp\TestJPEG.jpg", jpgEncoder, parameters);

var bytes = ((MemoryStream)stream).ToArray();
System.IO.Stream inputStream = new MemoryStream(bytes);
Bitmap fromDisk = new Bitmap(@"C:\Temp\TestJPEG.jpg");
Bitmap fromStream = new Bitmap(inputStream);

コードにはいくつかの違いがあります。どちらがあなたの問題を引き起こすかはあなた次第です、私は推測します:

  • 私は50Lとして使用しましqualityLevelた。、、、またはを使用する1と、「パラメータが無効です」というメッセージが表示されていました。変数のタイプや値がわからないので、問題になる可能性があります。250100ArgumentExceptionqualityLevel
  • GetEncoder私はあなたの方法を置き換えました。あなたの方法が正確に何をしているのかわからないので、それが問題になる可能性がありますが、私はそれを疑っています。
于 2013-02-08T09:58:06.367 に答える