Если в качестве значения свойства SizeMode элемента управления PictureBox выбрать значение StretchImage, а размеры элемента PictureBox не пропорциональны размерам загружаемого изображения, то изображение по ширине или высоте может исказиться. Особенно это заметно при динамической смене изображения. В этом случае лучше расположить изображение по центру (установить свойство SizeMode, равное CenterImage), а размеры PictureBox изменять динамически. В случае, когда изображение полностью помещается в элементе управления, ничего не происходит. Если же размеры изображения превышают размеры элемента управления, то можно изменять размеры элемента программно. Для этого необходимо написать специальную программу, например:
Visual Basic .Net:
Private Sub ResizeImage()
PictureBox1.Width = 594
PictureBox1.Height = 360
If PictureBox1.Image.Width < PictureBox1.Width And PictureBox1.Image.Height < PictureBox1.Height Then
В этой программе в случае, когда один из размеров изображения превысит соответствующий размер элемента управления, размер элемента управления будет изменён в соответствии с пропорциями изображения. Данную программу необходимо вызывать из процедуры загрузки изображения, например, при динамической смене изображения из обработчика события Timer1_Tick.
Логика данных процедур на разных языках несколько различается. Это связано с тем, что в C# невозможно явное преобразование типов Floatи Singleв Int, а размеры изображения в пикселях как раз имеют тип Int. Поэтому на C# вводится вспомогательная переменная k, которая по умолчанию принимает значение 1, что означает исходное соотношение размеров. Коэффициент преобразования же обозначен как k1, который имеет тип Int, но с помощью переменной kприводится к типу Single.
Работа с буфером обмена
Изображения, содержащиеся в элементе PictureBox, можно копировать в буфер обмена для последующего обмена с другими приложениями. В данный элемент также можно вставлять изображения из буфера обмена. Для этого используется специальный объект ClipBoard. Данный объект не требуется наносить на форму, он обрабатывается только программно.
Для копирования изображения в буфер обмена используется метод SetDataObject. Например, для копирования в буфер обмена изображения, размещённого на элементе PictureBox1, необходимо написать код:
Visual Basic .Net:
Clipboard.SetDataObject(PictureBox1.Image)
Visual C#:
Clipboard.SetDataObject(pictureBox1.Image);
Этот код может быть помещён, например, в обработчик события Click пункта контекстного меню «Копировать», которое предварительно должно быть создано и привязано к элементу PictureBox1.
Метод SetDataObject может иметь два аргумента. Второй, необязательный, аргумент, представляющий собой логическое выражение, определяет, должно ли помещённое в буфер обмена значение остаться там после завершения работы приложения, которое его туда поместило, например:
Visual Basic .Net:
Clipboard.SetDataObject(PictureBox1.Image,False)
Visual C#:
Clipboard.SetDataObject(pictureBox1.Image,false);
Для копирования изображения из буфера обмена используется метод GetDataObject. Он возвращает объект IDataObject, у которого имеются три метода:
GetData – считывает содержимое буфера обмена;
GetDataPresent – возвращает логическое значение True, если в буфере обмена содержатся данные указанного типа;
Последние два метода необходимы, т.к. в запросе на чтение данных из буфера обмена обязательно нужно указать, какие именно данные необходимо получить. Если там содержатся данные другого типа, необходимо выдать соответствующее сообщение. Например, для чтения из буфера обмена изображения и размещения его на элементе управления PictureBox1 необходимо записать код:
Перечисление DataFormats содержит константы, представляющие все поддерживаемые буфером обмена форматы – Text,HTML и др. Графическим данным соответствует формат Bitmap. Для проверки данного формата необходимо проверить, вернёт ли следующий код значение True:
Пример.Вставить изображение из буфера обмена в элемент управления PictureBox1. Данный код может быть записан, например, в обработчике события Click пункта «Вставить», контекстного меню, которое предварительно должно быть создано и привязано к элементу управления PictureBox:
Visual Basic .Net:
If Clipboard.GetDataObject.GetDataPresent(DataFormats.Bitmap) Then