我有一段时间创建缩略图然后将它们转换为字节数组。我已经尝试了三种方法,而且所有这三次都出错了。
第一个是使用Bitmap.GetThumbnailImage,我过去使用过,然后直接保存到Response.OutputStream
第二个是使用System.Drawing.Graphics和DrawImage()。仍然没有。
第三个是创建一个新的位图,传入旧的位图,并设置新的大小。同样的错误。
值不能为空。
参数名称:编码器
描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.ArgumentNullException:值不能为null 参数名称:编码器
来源错误:
在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。
堆栈跟踪:
[ArgumentNullException:值不能为空。
参数名称:编码器]
System.Drawing.Image.Save(Stream stream,ImageCodecInfo encoder,EncoderParameters encoderParams)+615244
这是我的方法的代码。也许有人会看到我做错了什么。如果你不确定GetThumbSize,它只是一个接收图像大小和最大拇指大小的方法,然后计算实际大小以保持宽高比。
public static System.Drawing.Image.GetThumbnailImageAbort thumbnailCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
public static bool ThumbnailCallback()
{
return false;
}
/// <summary>
///
/// </summary>
/// <param name="image"></param>
/// <param name="size"></param>
/// <remarks>
/// This method will throw a AccessViolationException when the machine OS running the server code is windows 7.
/// </remarks>
/// <returns></returns>
public static byte[] CreateThumbnail(byte[] imageData, Size size)
{
using (MemoryStream inStream = new MemoryStream())
{
inStream.Write(imageData, 0, imageData.Length);
using (System.Drawing.Image image = Bitmap.FromStream(inStream))
{
Size thumbSize = GetThumbSize(new Size(image.Width, image.Height), size);
//do not make image bigger
if (thumbSize.Equals(image.Size) || (image.Width < size.Width || image.Height < size.Height))
{
//if no shrinking is ocurring, return the original bytes
return imageData;
}
else
{
using (System.Drawing.Image thumb = image.GetThumbnailImage(thumbSize.Width, thumbSize.Height, thumbnailCallback, IntPtr.Zero))
{
using (MemoryStream outStream = new MemoryStream())
{
thumb.Save(outStream, thumb.RawFormat);
return outStream.ToArray();
}
}
}
}
}
}
这一行引发了错误:
thumb.Save(outStream, thumb.RawFormat);
有什么想法吗?谢谢你的帮助!
答案 0 :(得分:6)
我认为问题可能是原始图像的编码。 IIRC,保存(流,格式)导致调用Save(流,编码器,参数),编码器从格式中取出;在您的情况下,它是图像的原始格式。
根据Save method的社区内容,某些格式无法很好地转换为适当的编码器。
我建议您自己使用PNG等标准格式指定编码器。
尝试:
thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence
答案 1 :(得分:1)
如果您要尝试将其保存为原始格式,则可以尝试以下操作,因为在我的情况下,当原始图像格式是受支持的格式时,它可以正常工作:
try
{
thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
thumb.Save(outStream, ImageFormat.Png);
}