【发布时间】:2011-03-10 07:29:48
【问题描述】:
我正在尝试使用 Microsoft 的此示例代码来确定哪些编码器选项可用于 JPEG 编码器。 (我要解决的真正问题是看我是否可以显式设置色度子采样参数)
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;
}
问题是,“GetEncoderParameterList”总是抛出异常:Bitmap Region Is already Locked。
我尝试将代码放在程序的最开头,而不是放在绘制事件处理程序中。一样。我尝试改变位图上的位深度,并以其他方式创建位图,没有区别。
知道为什么 .NET 会认为新创建的位图具有锁定区域吗?
更新!更多信息:如果我使用 TIFF 编码器,它不会失败:
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;
所以我认为这可能只是 jpeg 的 GetEncoderparameterList 的错误/限制....
【问题讨论】:
标签: c# visual-studio-2010 graphics .net-4.0 bitmap