Изменение размера изображения с сохранением MIME-типа с использованием .Net - PullRequest
0 голосов
/ 20 августа 2010

Я загружаю изображения из базы данных и хочу динамически изменить их размер в соответствии с некоторыми данными.

Код выглядит примерно так:

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 таким образом, чтобы сохранить тип кодировки и т. Д.? Я посмотрел на Эффективность изменения размера изображения в C # и .NET 3.5 , но не понимаю, как это сохранит кодировку - поскольку создание нового растрового изображения наверняка не закодировано?

Ответы [ 2 ]

3 голосов
/ 20 августа 2010

На самом деле, мне удалось решить это с помощью Google в конце концов. Думаю, я был слишком доволен этим вопросом. В любом случае, основные биты в том, что я ищу правильный ImageFormat из mimetype, используя ImageCodecInfo.GetImageEncoders (), затем сохраняю, используя правильную кодировку, как показано ниже:

    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 голос
/ 20 августа 2010

Чтобы сохранить тип файла, вы должны посмотреть на тот тип файла, который есть у исходного файла, и при сохранении файла вы указываете формат файла.

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

В вашем случае вы, вероятно, захотите сохранить в MemoryStream, который выпозже преобразовать в байтовый массив (предполагая, что ваш info.Data имеет тип byte[]).

...