Измените размер изображения в PictureBox настолько, насколько это возможно, при сохранении пропорций?

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

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

Ответ 1

Я считаю, что это эффект PictureBoxSizeMode.Zoom. В документации указано, что:

Размер изображения увеличивается или уменьшается, поддерживая соотношение размеров.

Вы устанавливаете это в свойстве PictureBox.SizeMode. В разделе "Замечания" документации для этой функции также говорится:

Использование значения Zoom приводит к тому, что изображение растягивается или уменьшается, чтобы соответствовать PictureBox; однако соотношение сторон в оригинале сохраняется.

Вы можете, конечно, установить свойство PictureBox.SizeMode либо в окне свойств конструктора, либо в коде (например, в конструкторе формы):

myPictureBox.SizeMode = PictureBoxSizeMode.Zoom;

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

В качестве альтернативы, чтобы избежать создания временных растровых изображений, вы можете сделать то, что, возможно, делает элемент управления PictureBox внутри, и использовать метод Graphics.DrawImage для обработки растяжения. Если вы передадите ему прямоугольник, он автоматически масштабирует изображение, чтобы оно поместилось внутри прямоугольника.

Ответ 2

Измените параметр 'SizeMode' на Zoom. Как следует из названия, "StretchImage" растянет его, чтобы он соответствовал файлу изображения. Легкий процесс устранения даст вам тот же результат.

Ответ 3

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

И вы можете играть с Dock свойство (установка DockStyle.Full), чтобы изменить размер окна изображения до размера его контейнера.

Ответ 4

Вы можете добавить его в элемент управления веб-браузера. С помощью кнопки Ctrl и мыши вы можете увеличивать столько, сколько хотите.