gpt4 book ai didi

c# - GetEncoderParameterList 出现意外的 "Bitmap Region is already Locked"异常。有任何想法吗?

转载 作者:太空狗 更新时间:2023-10-30 01:11:11 26 4
gpt4 key购买 nike

我正在尝试使用 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 的错误/限制....

最佳答案

我重述了这一点。异常消息是伪造的,这对于 GDI+ 异常很常见。问题的根源是 jpeg 编解码器,GetEncoderParameterList() 查询它以获取它支持的参数列表。它返回的列表包含一个错误条目,NumberOfValues 为 0。这导致 Marshal.AllocHGlobal() 返回 NULL,被误解为内存不足异常,这又被误解为“位图区域已被锁定"异常。

呃,GDI+ 真是一团糟。这个问题几乎可以肯定是 GDI+ 版本 1.10 所特有的,该版本最初随 Vista 一起提供。也可能是 Win7 特有的,我在论坛上看到过几个关于该操作系统上 JPEG 编解码器问题的帖子。

好吧,在下一个 Windows 服务包可用之前,您无能为力。要解决您的特定查询,不,可能不会。 GDI+ 知道的编码器参数列表在 GdiPlusImaging.h SDK 头文件中列出。唯一接近的是“EncoderChrominanceTable”,在 .NET 框架中作为 Encoder.ChrominanceTable.Guid 提供。不知道这是否接近您要查找的内容。

您真的应该考虑 WPF JpegBitmapEncoder 类,这是对 GDI= 的重大改进。

关于c# - GetEncoderParameterList 出现意外的 "Bitmap Region is already Locked"异常。有任何想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3152506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com