#c# #wpf
#c# #wpf
Вопрос:
У меня есть приложение WPF, которое сохраняет уменьшенное изображение в виде png. Код работает достаточно хорошо, но когда я открываю изображение, оно очень размыто. Изображение, которое он захватывает, берется из самого холста. Холст меняет свою ширину и высоту в зависимости от загружаемого изображения. Желаемый размер миниатюры будет 200 x 200 (пикселей).
Вот мой код
public void CreateThumbail(Canvas canvas, string filename)
{
RenderTargetBitmap rtb = new RenderTargetBitmap(
(int)canvas.ActualWidth,
(int)canvas.ActualHeight,
96, //dip X
96, //dpi Y
PixelFormats.Pbgra32);
rtb.Render(canvas);
PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(CreateResizedImage(rtb, 200, 200, 0));
using (var filestream = System.IO.File.Create(filename))
{
pngImage.Save(filestream);
}
}
private static BitmapFrame CreateResizedImage(ImageSource source, int width, int height, int margin)
{
var rect = new Rect(margin, margin, width, height);
var group = new DrawingGroup();
RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.HighQuality);
group.Children.Add(new ImageDrawing(source, rect));
var drawingVisual = new DrawingVisual();
using (var drawingContext = drawingVisual.RenderOpen())
drawingContext.DrawDrawing(group);
var resizedImage = new RenderTargetBitmap(
(int)rect.Width, (int)rect.Height,// Resized dimensions
96, 96, // Default DPI values
PixelFormats.Pbgra32); // Default pixel format
resizedImage.Render(drawingVisual);
return BitmapFrame.Create(resizedImage);
}
Я сохранил изображение, прежде чем изменить его размер, и оно выглядит четким. но когда я сохраняю миниатюру, она становится уродливой и размытой. Что я делаю не так? Я переоцениваю это? Заранее большое спасибо.
Ответ №1:
Вероятно, вам нужно соблюдать исходные размеры изображения. Например, изображение размером 400×400 будет уменьшено до 200×200 довольно хорошо, но изображение размером 235×235 не будет.
Это не учитывает изображения, которые изначально не являются квадратными.
Вы могли бы попробовать уменьшить высоту и ширину изображения на хороший коэффициент (я бы начал с уменьшения вдвое) несколько раз, пока изображение не станет меньше 200×200, а затем дополнить его белым или прозрачным.
Обработка изображений может быть довольно сложной. Я тоже не являюсь экспертом в этом, поэтому я бы, вероятно, попробовал стороннюю библиотеку, подобную этой, которую я только что нашел в Google:https://imageprocessor.org /