Изменение размера потока JPEG в памяти с помощью .NET, C #

1

Я работаю с WPF,.NET 3.5, С#. У меня есть массив байтов в jpeg файле в памяти, загруженной из базы данных, и я хотел бы изменить его размер до меньшего размера по памяти.

  • input - это массив байтов массива jpeg в памяти.
  • output - это массив байтов массива jpeg в памяти, представляющий измененное изображение jpeg.
  • изменение размера (и повторное кодирование) должно выполняться в памяти без использования FILE.
  • изменение размера может быть выполнено с помощью двухстрочного режима.

Пожалуйста, помогите мне сделать это.

  • 0
    Миниатюра ?
  • 6
    что ты уже испробовал? Если бы это был я, я бы изучал класс Image, но я не делаю WPF, поэтому не знаю, есть ли лучший способ. Класс Image работал для меня, когда мне нужно было работать с обычными форматами изображений. msdn.microsoft.com/en-us/library/...
Показать ещё 1 комментарий
Теги:
wpf
image

2 ответа

0
Лучший ответ

Быстрый поиск в Google дает статью MSDN, в которой говорится, как это сделать.

Простой пример:

System.Drawing.Image source = System.Drawing.Image.FromFile(@"Z:\Temp\temp.bmp");
System.Drawing.Image destination = new System.Drawing.Bitmap(128, 128);

using (var g = Graphics.FromImage(destination))
{
    g.InterpolationMode = InterpolationMode.HighQualityBilinear;
    g.DrawImage(source, new System.Drawing.Rectangle(0,0,128,128), new System.Drawing.Rectangle(0, 0,source.Width, source.Height), GraphicsUnit.Pixel);
}

destination.Save(@"Z:\Temp\outpt.png", ImageFormat.Png);

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

  • 0
    Этот метод позволяет вам выбрать алгоритм интерполяции, что является преимуществом. Но поскольку вы используете WPF, лучше использовать BitmapSource, а не Bitmap.
  • 0
    Спасибо за ответ. Да, твой код сработал. Мне нужно было изменить код, чтобы не использовать файл, как вы упоминали, но я мог получить то, что хотел. Благодарю.
0

Вы также можете использовать эту функцию:

public static BitmapImage BitmapImageFromBitmapSourceResized(BitmapSource bitmapSource, int newWidth)
    {
    BmpBitmapEncoder encoder = new BmpBitmapEncoder();
    MemoryStream memoryStream = new MemoryStream();
    BitmapImage bImg = new BitmapImage();

    encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
    encoder.Save(memoryStream);

    bImg.BeginInit();
    bImg.StreamSource = new MemoryStream(memoryStream.ToArray());
    bImg.DecodePixelWidth = newWidth;
    bImg.EndInit();
    memoryStream.Close();
    return bImg;
}

Использование этой функции рекомендуется Microsoft, поскольку изображение не сохраняется в исходном размере, но с размером newWidth. Он может избежать переполнения памяти, если пользователь вводит огромные изображения.

  • 0
    Спасибо за ваш ответ. Я попробовал ваш код, но resut - это не то, что я хотел. Поскольку это не выполняет перекодирование, поток памяти возвращаемого BitmapImage не изменяется. Мне нужно перекодировать, меньший поток памяти для измененного размера изображения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню