Reputation: 1128
I have a pretty strange Error. I need to scale down images, scale down the quality and convert to JPEG. This all works when I save the File on disk, but it doesn't work when I save it to a Stream.
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
I can also open the converted file with Paint. Any suggestions?
Edit: I'm using .Net Framework 4.0 on Windows 7 Professional
Edit2: Tried that Seek thing (Answer was deleted)
stream.Seek( 0, SeekOrigin.Begin );
It workes with the "old" stream. But i need to load it from a byte Array. Still same crash
Upvotes: 4
Views: 11883
Reputation: 174299
The following code works for me:
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);
There are a few differences to your code. Which one causes your problem is up to you to find out, I guess:
50L
as qualityLevel
. When using 1
, 2
, 50
or 100
, I was getting an ArgumentException
"Parameter is not valid". As I don't know the type or value of your qualityLevel
variable that can very well be the problem.GetEncoder
method. I don't know what your method does exactly, so it could be the problem, but I doubt it.Upvotes: 2