I am trying to use this sample code from Microsoft to determine which encoder options are available for a JPEG encoder. (The real problem I'm trying to solve is to check if I can explicitly set Chroma subselect options)
http://msdn.microsoft.com/en-us/library/bb882589.aspx
private void GetSupportedParameters(PaintEventArgs e) { Bitmap bitmap1 = new Bitmap(1, 1); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); EncoderParameters paramList = bitmap1.GetEncoderParameterList(jpgEncoder.Clsid); EncoderParameter[] encParams = paramList.Param; StringBuilder paramInfo = new StringBuilder(); for (int i = 0; i < encParams.Length; i++) { paramInfo.Append("Param " + i + " holds " + encParams[i].NumberOfValues + " items of type " + encParams[i].ValueType + "\r\n" + "Guid category: " + encParams[i].Encoder.Guid + "\r\n"); } e.Graphics.DrawString(paramInfo.ToString(), this.Font, Brushes.Red, 10.0F, 10.0F); } private ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; }
The problem is that "GetEncoderParameterList" always throws an exception: the bitmap area is already locked.
I tried to put the code at the very beginning of my program, and not in the event handler in the language. Same. I tried to change the bit depth in the bitmap and create bitmaps in other ways, no difference.
Any idea why .NET thinks the newly created bitmap has a locked area?
Update! Additional information: if I use the TIFF encoder, it is not interrupted:
Bitmap bitmap1 = new Bitmap(1, 1); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.TIFF); // TIFF instead of JPEG EncoderParameters paramList = bitmap1.GetEncoderParameterList(jpgEncoder.Clsid); EncoderParameter[] encParams = paramList.Param;
So, I think it could just be a GetEncoderparameterList error / limitation for jpeg ....
user122299
source share