Как изменить размер изображения, чтобы заполнить новые размеры?

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

 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;
        }

Что такое image.Width, image.Height, width, height? Можете ли вы показать результат, который вы на самом деле получаете?

Ben Voigt 15.12.2020 17:16

Отвечает ли это на ваш вопрос? Изменение размера изображения с помощью C#

user12031933 15.12.2020 17:28

@BenVoigt image.Width и image.Height — исходные размеры изображения, width и height — новые размеры. Если вы попытаетесь запустить этот фрагмент кода на любом изображении, а затем открыть изображение в paint, вы увидите, что размеры правильные, но изображение не заполняет все размеры на холсте, кажется, что оно только увеличивается пропорционально на каком-то уровне.

Felipe 15.12.2020 17:45

Уже было понятно, что они представляют, но каковы их фактические (числовые) значения?

Ben Voigt 15.12.2020 17:46

@OlivierRogier Я посмотрел принятый ответ, приведенный в предоставленной ссылке, и те же результаты, никакой разницы.

Felipe 15.12.2020 17:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
549
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно нарисовать свое изображение с помощью новых width и height. Это будет выглядеть так:

  graphics.DrawImage(image, destRect, 0, 0, destRect.Width, destRect.Height, GraphicsUnit.Pixel, wrapMode);

Я внес изменения, и вместо того, чтобы растянуть изображение, он сделал 4 копии/дубликата по одному в каждом углу холста.

Felipe 15.12.2020 16:18

@Felipe: Как вы думаете, что означает TileFlipXY?

Ben Voigt 15.12.2020 16:52

@BenVoigt да, я пробовал без wrapMode , без копий / дубликатов, но изображение продолжает не растягиваться до размеров.

Felipe 15.12.2020 16:55

Поскольку вы хотите растянуть все исходное изображение до заданного размера, просто используйте простую перегрузку с пятью аргументами, которая не принимает исходные координаты:

Вот так:

graphics.DrawImage(image, 0, 0, width, height);

Не уверен, проверяли ли вы с каким-то изображением или нет, но я сделал по инструкции и остался прежним, я стер блок wrapMode. Что происходит: изображение создается с указанной шириной и высотой, но по какой-то причине оно не заполняет все размеры, кажется, что оно увеличивается пропорционально ширине и высоте, но мне нужно заполнить все пространство без фона.

Felipe 15.12.2020 17:31

@Felipe: Вы говорите, что он масштабируется с сохранением соотношения сторон, и вы хотите, чтобы оно растянулось до нового соотношения сторон? (Однако я почти уверен, что этот вызов функции выполняет растяжение без сохранения соотношения сторон)

Ben Voigt 15.12.2020 17:40

@Felipe: Вы пытаетесь удалить пустое пространство, присутствующее в исходном изображении?

Ben Voigt 15.12.2020 17:43

возможно, вы правы, я попытаюсь удалить пробелы с исходного изображения.

Felipe 15.12.2020 17:55

@Filipe: Если внутри image.Width и image.Height есть пустое пространство, оно ничем не отличается от остальной части изображения. В вызове DrawImage, который я предлагаю, у него нет возможности узнать, что вы хотите отбросить пустые области, и именно в вашем вопросе вы конкретно указываете, какой прямоугольник исходного изображения растянуть, и включаете пустое пространство в прямоугольник, который вы ему дали. Вы должны были бы дать ему прямоугольник, который определяет «важную» часть вашего изображения... тогда эта часть заполнит область назначения.

Ben Voigt 15.12.2020 22:56
Ответ принят как подходящий

Хотя ни один из ответов не сработал для меня, я ценю всю помощь и предложения, благодаря которым я смог довольно быстро найти решение, вот фрагмент кода, который сработал для меня:

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»?

Fredy 21.02.2023 00:47

Другие вопросы по теме