使用.Net保留mimetype时调整图像大小

时间:2010-08-20 10:11:09

标签: c# asp.net-mvc-2 image-processing resize

我正在从数据库加载图像,并希望根据某些输入动态调整它们的大小。

代码是这样的:

public ActionResult GetImage(string imageID, int? width, int? height, bool constrain)
    {
        ValidateImageInput(width, height, constrain);
        ImageWithMimeType info = LoadFromDatabase(imageID);

        if(info == null)
            throw new HttpException(404, "Image with that name or id was not found.");

        Resize(info.Bytedata, width, height, constrain, info.MimeType);

        return File(info.Data, info.MimeType);
    }

如何以保留编码类型等的方式实现Resize?我看过Image resizing efficiency in C# and .NET 3.5但是看不出它会如何保留编码 - 因为创建一个新的Bitmap肯定没有编码?

2 个答案:

答案 0 :(得分:3)

事实上,我最终在google的帮助下设法解决了这个问题。猜猜我对这个问题有点过于高兴。无论如何,基本的一点是我使用ImageCodecInfo.GetImageEncoders()从mimetype中查找正确的ImageFormat,然后使用正确的编码保存,如下所示:

    private ImageFormat GetEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return new ImageFormat(codecs[i].FormatID);
        return null;
    }

这是我对http://www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing

上的代码略有不同的版本

使用ImageFormat我可以简单地做

image.Save(dest, GetEncoderInfo(mimetype));

答案 1 :(得分:1)

要保留文件类型,您必须查看原始文件所具有的文件类型,并在保存文件时指定文件格式。

Bitmap b = new Bitmap("foo.jpg");
b.Save("bar.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

在您的情况下,您可能会保存到MemoryStream,稍后您将转换为字节数组(猜测您的info.Data类型为byte[])。