Я пытаюсь растянуть изображение, чтобы оно соответствовало новым размерам, но я не могу понять, как заставить изображение заполнять новые размеры, оно только создает больший размер изображения, но сохраняет изображение нетронутым, я хочу изображение для заполнения указанной ширины и высоты.
private Bitmap resizeImage(Image image, int width, int height, float HorizontalResolution, float VerticalResolution)
{
Rectangle destRect = new Rectangle(0, 0, width, height);
Bitmap destImage = new Bitmap(width, height);
destImage.SetResolution(HorizontalResolution, VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
Отвечает ли это на ваш вопрос? Изменение размера изображения с помощью C#
@BenVoigt image.Width
и image.Height
— исходные размеры изображения, width
и height
— новые размеры. Если вы попытаетесь запустить этот фрагмент кода на любом изображении, а затем открыть изображение в paint
, вы увидите, что размеры правильные, но изображение не заполняет все размеры на холсте, кажется, что оно только увеличивается пропорционально на каком-то уровне.
Уже было понятно, что они представляют, но каковы их фактические (числовые) значения?
@OlivierRogier Я посмотрел принятый ответ, приведенный в предоставленной ссылке, и те же результаты, никакой разницы.
Вам нужно нарисовать свое изображение с помощью новых width
и height
. Это будет выглядеть так:
graphics.DrawImage(image, destRect, 0, 0, destRect.Width, destRect.Height, GraphicsUnit.Pixel, wrapMode);
Я внес изменения, и вместо того, чтобы растянуть изображение, он сделал 4 копии/дубликата по одному в каждом углу холста.
@Felipe: Как вы думаете, что означает TileFlipXY
?
@BenVoigt да, я пробовал без wrapMode
, без копий / дубликатов, но изображение продолжает не растягиваться до размеров.
Поскольку вы хотите растянуть все исходное изображение до заданного размера, просто используйте простую перегрузку с пятью аргументами, которая не принимает исходные координаты:
Вот так:
graphics.DrawImage(image, 0, 0, width, height);
Не уверен, проверяли ли вы с каким-то изображением или нет, но я сделал по инструкции и остался прежним, я стер блок wrapMode
. Что происходит: изображение создается с указанной шириной и высотой, но по какой-то причине оно не заполняет все размеры, кажется, что оно увеличивается пропорционально ширине и высоте, но мне нужно заполнить все пространство без фона.
@Felipe: Вы говорите, что он масштабируется с сохранением соотношения сторон, и вы хотите, чтобы оно растянулось до нового соотношения сторон? (Однако я почти уверен, что этот вызов функции выполняет растяжение без сохранения соотношения сторон)
@Felipe: Вы пытаетесь удалить пустое пространство, присутствующее в исходном изображении?
возможно, вы правы, я попытаюсь удалить пробелы с исходного изображения.
@Filipe: Если внутри image.Width
и image.Height
есть пустое пространство, оно ничем не отличается от остальной части изображения. В вызове DrawImage
, который я предлагаю, у него нет возможности узнать, что вы хотите отбросить пустые области, и именно в вашем вопросе вы конкретно указываете, какой прямоугольник исходного изображения растянуть, и включаете пустое пространство в прямоугольник, который вы ему дали. Вы должны были бы дать ему прямоугольник, который определяет «важную» часть вашего изображения... тогда эта часть заполнит область назначения.
Хотя ни один из ответов не сработал для меня, я ценю всю помощь и предложения, благодаря которым я смог довольно быстро найти решение, вот фрагмент кода, который сработал для меня:
private Bitmap resizeImage(Image image, int width, int height, float HorizontalResolution, float VerticalResolution)
{
Rectangle destRect = new Rectangle(0, 0, width, height);
Bitmap destImage = new Bitmap(width, height);
destImage.SetResolution(HorizontalResolution, VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
//drawImage must be set this way to get the desired outcome
graphics.DrawImage(imageBox.Image, new Rectangle(0, 0, image.Width, image.Height), destRect, GraphicsUnit.Pixel);
}
return destImage;
}
По сути, я удалил код wrapMode
и изменил свой метод drawImage
.
Пожалуйста, что такое «imageBox»?
Что такое
image.Width
,image.Height
,width
,height
? Можете ли вы показать результат, который вы на самом деле получаете?