Как вставить изображение из буфера обмена

image-from-clipboard

Необходимость вставки изображения из буфера обмена в приложении, связанного с графикой, возникает всегда. По этому поводу небольшой пост и очень простой способ.

Использовать метод LoadFromClipboardFormat класса TGraphic достаточно затруднительно. Во-первых, потому что он громоздкий:

Во-вторых, вот что написано в комментариях к этому методу в модуле Vcl.Graphics:

LoadFromClipboardFormat — заменяет текущее изображение предоставленными данными. Если TGraphic не поддерживает этот формат, он сгенерирует исключение.

Проще говоря, если создали не тот TGraphic, будут проблемы.

Поэтому всегда лучше использовать экземпляр класса TPicture. Его можно создать динамически, или использовать уже существующий на форме. Например, свойство Picture компонента TImage.

Для вставки изображения из буфера обмена используем известный хак, чтобы добраться до protected метода AssignTo класса TClipboard.

Метод SetGraphic — метод что-то делающий на смену текущего TGraphic. Например:

Единственная проблема — чтобы вы не скопировали в буфер обмена, вставляться всегда будет TBitmap.

Хорошая новость — альфа канал также будет вставлен. Плохая новость — стандартный TBitmap работает с альфа-каналом так себе. Чтобы отобразить пришедший из буфера обмена битмап в наилучшем виде, надо использовать GDI+ или Direct2D.

Копируем из браузера оригинал:

Рис1. Скопировать из браузера в буфера обмена
Рис.1. TBitmap плохо работает с альфа каналом
Рис.3. GDI+ хорошо работает с альфа каналом
Рис.4. Direct2D прекрасно работает с альфа каналом

Вообще, всегда лучше работать с TPicture. Он для этого и был создан, чтобы разруливать проблемы с нужным классом-наследником от TGraphic. Например, при открытии файла, чтобы не мучиться проблемой — какой TGraphic создавать, всегда можно воспользоваться методом LoadFromFile экземпляра TPicture. Он там внутри сам разберется, какой класс использовать.

Чтобы иметь возможность открывать больше форматов не забываем добавлять в предложение uses соответствующие модули. Например:

И, пожалуй, еще одно. Бывает так, что при вызове диалогов в Delphi возникает неприятный завис, ни диалога, ни реакций в приложении. Поэтому, во избежании такого поведения, имеет смысл где-нибудь пораньше в коде вставить такую запись:


Этим постом открываю рубрику «Коротыши». Планирую писать сюда всякие мелкие полезняшки. В меню сайта пока не вывожу, думаю использовать в качестве поясняющего материала к статьям.

Информация о новые коротышах доступна в телеграм-канале. Подписывайтесь, чтобы не пропустить ) Там же можно комментировать и участвовать в обсуждении.

Поиск этой темы на сайте. По результатам поиска можно будет найти статью, откуда взяты скриншоты. Она пока не опубликована.


5 4 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Не нашли ответ на свой вопрос? Задайте его здесь!...x