Сохранить изображение в файл с сохранением соотношения сторон в приложении WPF - PullRequest
3 голосов
/ 10 января 2011

Привет, я пытаюсь масштабировать изображение PNG с прозрачным фоном. Мне нужно, чтобы оно было 250x250 пикселей.

Горизонтальное и вертикальное центрирование с сохранением правильного соотношения сторон. Возможность установить наценку.

Это то, что я получил до сих пор.

var img = new System.Windows.Controls.Image();
var bi = new BitmapImage(new Uri("C://tmp/original.png", UriKind.RelativeOrAbsolute));
img.Stretch = Stretch.Uniform;
img.Width = 250;
img.Height = 250;
img.Source = bi;

var pngBitmapEncoder = new PngBitmapEncoder();

var stream = new FileStream("C://tmp/test3.png", FileMode.Create);

pngBitmapEncoder.Frames.Add(BitmapFrame.Create(img));
pngBitmapEncoder.Save(stream);
stream.Close();

Я знаю, что объект Image еще не используется, и поэтому просто сохраняет изображение, не масштабируя его. Но у меня проблемы с сохранением объекта Image. Выдает ошибку компиляции: невозможно конвертировать из 'System.Windows.Controls.Image' в 'System.Uri'

Надеюсь, кто-нибудь может мне помочь: -)

EDIT

Обновлен код до версии с ошибкой компиляции. только что изменилось

pngBitmapEncoder.Frames.Add(BitmapFrame.Create(bi));

до

pngBitmapEncoder.Frames.Add(BitmapFrame.Create(img));

А вот список моего использования

using System;
using System.Drawing;
using System.IO;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Image = System.Windows.Controls.Image;

1 Ответ

3 голосов
/ 10 января 2011

То, что вы делаете, похоже на увеличение изображения в редакторе и ожидание его отражения в основном изображении при сохранении.Что вам нужно сделать, это создать TransformedBitmap , чтобы изменить изображение, а затем добавить его в кадры.например,

        var scale = new ScaleTransform(250 / bi.Width, 250 / bi.Height);
        var tb = new TransformedBitmap(bi, scale);
        pngBitmapEncoder.Frames.Add( BitmapFrame.Create(tb));

Обновление Относительно соотношения сторон.

Мне нужно, чтобы он был 250x250 пикселей

Если исходное изображение не имеет соотношения 1: 1 по высоте и ширине, масштабирование выше соответствует «Мне нужно»это будет 250X250 ", но создаст искажение.

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

Чтобы обрезать изображение, вы можете использовать Свойство Clip или CroppedBitmap .Чтобы масштабировать только одно измерение, вы просто используете одно измерение, чтобы определить масштаб, например new ScaleTransform(250 / bi.Width, 250 / bi.width);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...