Конвертация TIFF в JPEG. Увеличение размера изображения. - PullRequest
2 голосов
/ 15 декабря 2010

У меня есть следующая функция, которая берет tiff, сохраненный как blob из более старой базы данных, преобразует его в jpeg и затем сохраняет его как varbinary(max) в sql server.

public byte[] ConvertImage(byte[] imageData)
{
    if (imageData == null) return null;
    using (var image = Image.FromStream(new MemoryStream(imageData)))
    {
        using (Bitmap bmp = new Bitmap(image))
        {
            using (MemoryStream outStream = new MemoryStream())
              {
                  bmp.Save(outStream, ImageFormat.Jpeg);
                  return outStream.ToArray();
              }
        }
    }
}

По какой-то причине преобразование приводит к увеличению размера изображения в 10 и более раз. Я что-то делаю неправильно?

Спасибо за любую помощь

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Вы можете попробовать изменить уровень сжатия JPEG: http://msdn.microsoft.com/en-us/library/bb882583.aspx

Однако JPEG не всегда будет лучше, чем TIFF.TIFF - это контейнерный формат, который может использовать все виды форматов сжатия изображений, поэтому ваше изображение может быть сжато другим способом.

1 голос
/ 15 декабря 2010

Вам нужно добавить EncoderParameter для качества. Попробуйте что-то вроде:

public byte[] ConvertImage(byte[] imageData)
{
    if (imageData == null) return null;
    using (var image = Image.FromStream(new MemoryStream(imageData)))
    {
        using (Bitmap bmp = new Bitmap(image))
        {
            using (MemoryStream outStream = new MemoryStream())
            {
                var ratio = new EncoderParameter(Encoder.Quality, 50L); //adjust this value for desired compression 
                var codecParams = new EncoderParameters(1);
                codecParams.Param[0] = ratio;
                bmp.Save(outStream, GetEncoder(ImageFormat.Jpeg), codecParams);
                return outStream.ToArray();
            }
        }
    }
}

ImageCodecInfo GetEncoder(ImageFormat format)
{
    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
    foreach (ImageCodecInfo codec in codecs)
        if (codec.FormatID == format.Guid)
            return codec;
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...