创建缩略图,然后转换为字节数组

Jos*_*osh 7 system.drawing bytearray thumbnails

我有一段时间创建缩略图然后将它们转换为字节数组.我尝试了三种方法,并且我都遇到了3次错误.

第一个是使用Bitmap.GetThumbnailImage,我过去使用过,然后直接保存到Response.OutputStream

第二个是使用System.Drawing.Graphics和DrawImage().仍然没有去.

第三个是创建一个新的位图,传入旧的位图,并设置新的大小.同样的错误.

值不能为空.
参数名称:encoder

说明:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.ArgumentNullException:Value不能为null.
参数名称:encoder

源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.

堆栈跟踪:
[ArgumentNullException:值不能为null.
参数名称:encoder]
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();
                        }
                    }
                }
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

这一行抛出错误:

thumb.Save(outStream, thumb.RawFormat);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢您的帮助!

Ran*_*pho 6

我认为问题可能是原始图像的编码.IIRC,保存(流,格式)导致调用Save(流,编码器,参数),编码器从格式中取出; 在您的情况下,它是图像的原始格式.

根据Save方法的社区内容,某些格式无法很好地转换为适当的编码器.

我建议你自己指定编码器,使用像PNG这样的标准格式.

尝试:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence
Run Code Online (Sandbox Code Playgroud)

  • 你的建议让我尝试了一些东西.我刚刚写了一个方法将ImageFormat转换为mimetype.我通过这个运行原始图像的格式,它返回"image/gif",这是预期的,因为文件扩展名是.gif.然后我用以下方法替换了冒犯:thumb.Save(outStream,image.RawFormat); 它的工作原理.谢谢您的帮助. (2认同)