Как вставить картинку в делфи
Информационные технологии 1
Программирование на Delphi
1. Введение
Первая программа
Традиционно при изучении программирования принято создавать первую программу, которая выводит текст «Hello, world!». Не будем отступать от традиции и создадим программу, которая выводит этот текст тремя разными способами. Но вначале познакомимся с самой средой программирования Delphi. Предполагается, что на этот момент Delphi 7 уже установлена на вашем ПК. Если это не так, то перед дальнейшим прочтением лекции установите Delphi 7. При загрузке Delphi 7 вы видите такую картину:
Рис. 1.1. Рабочая среда Delphi 7
Познакомьтесь – это Delphi. У нее есть много окон, панелей, компонентов. С большинством из них мы познакомимся со временем, а пока нам нужно обратить внимание на 5 окон:
Рис. 1.2. Кнопки Save (Сохранить) и Save All (Сохранить всё) на панели инструментов
Обратите внимание, что свойства в Объектном Инспекторе принадлежат выделенному в данный момент компоненту. Выделяются компоненты простым щелчком мыши. Имейте в виду, что щелкать нужно один раз. Двойной щелчок создаст обработчик события – процедуру. Если вы ошибочно создадите таким образом процедуру, то просто сохраните проект, ничего в нее не вписывая – при сохранении последние пустые процедуры автоматически удаляются. Удалять их вручную не рекомендуется.
Снова сохраните проект и нажмите кнопку Run (или ). Убедитесь, что надпись появилась на форме, после чего закройте программу (но не Delphi) и вернитесь к форме.
Попробуем третий, немного более сложный способ. Пока что мы создавали программу, не написав ни единой строки кода. Мы занимались только дизайном, все остальные трудности Delphi взяла на себя. Теперь попробуем вывести это же сообщение, как только пользователь нажмет кнопку на форме.
Далее нам нужно создать обработчик нажатия на кнопку. Обработчик представляет собой процедуру, в которой мы будем писать наш код. Этот код будет выполняться программой всякий раз, когда пользователь нажмет на эту кнопку. Чтобы создать этот обработчик, следует дважды нажать на кнопку на форме. Вы сразу попадаете в редактор кода и видите, что процедура уже создана, курсор мигает в том месте, где мы должны ввести свой код. Пока что не будем разбираться, что тут к чему, а просто впишем строку:
Как загрузить картинку в delphi
Компонент delphi Image предназначен для отображение на форме графических изображений по умолчанию выводит на поверхность формы изображения представленных в bmp формате. Для вывода изображений в jpg формате необходимо в дерективе uses подключить модуль JPEG. После размещения на форме компонента Image, он принимает вид выделенной прямоугольной области(рис 1).
Загрузить картинку можно в коде программы, добавив строку:
Image1.Picture.LoadFromFile( );
Кроме этого, загрузить изображения можно с помощью Object Inspector. Для этого находим свойство Picture и слева от него нажимаем на три точки. Открывается окно Picture Editor и в нем выбираем загрузить(Load), в раскрывшемся окне выбираем файл изображения.
Мне необходимо превратить картинку объекта класса TImage в переменную, которую я в случае чего могу загрузить обратно и сделать ее картинкой того же объекта, т.к. он периодически изменяется.
1 ответ 1
Данные можно хранить в динамических массивах array of TBitmap
Тут обращение к картинке с использованием типа происходит
Этот вариант предпочтительнее так как можно сохранить имя файла.
Можно создать свою структуру и добавлять её в TList / TStringList
У bitmap есть методы сохранения в файл и поток, также как и TPicture (Image1.Picture)
О том как добавлять текстовую информацию, я писал в соответствующем посте. Но как добавить картинку? И какие в связи с этим могут возникнуть трудности? Частично добавление картинок было рассмотрено в посте про DataControls в разделе DBImage.
ДЛЯ БОЛЬШИНСТВА ФОРМАТОВ
Ссылку на класс TWICImage мне отправил пользователь под ником RIUS, эта информация добавлена чуть позже, чем я написал основной пост, но мне она показалась интересной, потому что позволяет работать с большинством форматов (единственное, пока не разобрался с PNG, с прозрачными слоями)…
Итак, знакомьтесь, класс TWICImage – позволяет обрабатывать BMP, JPEG, TIFF, PNG и др. популярные форматы…
Ещё полезная ссылка по данному классу.
Ниже Вы найдете информацию о “стандартных” способах добавления картинок в БД и чтения из БД. TWICImage я поставил наверх, потому что он, на мой взгляд, более универсальный.
ДОБАВЛЕНИЕ / ЧТЕНИЕ ЧЕРЕЗ TMemoryStream (Подходит для BMP,JPEG и др. НО НЕ PNG)
C BMP, JPEG такой трюк хорошо пройдет, только для JPEG надо подключить в uses модуль JPEG; C PNG трабл в том, что, при наличии прозрачного слоя – возникает черный фон. Как это победить, пока не придумал ((
Как сохранить изображение в БД?
Как прочитать изображение из БД?
Самое простое – в компонент DBImage, предварительно выставив свойства (например в FormCreate…)
2 способ – загрузка изображения в компонент image из BLOB поля БД…
ДОБАВЛЕНИЕ / ЧТЕНИЕ ЧЕРЕЗ ASSIGN (Подходит для BMP,JPEG и др. НО НЕ PNG)
(на примере записи в базу jpeg)
ТРАБЛ С PNG
Если применить эти методы к файлам формата PNG, то при наличии прозрачного слоя у меня возникал черный фон.
Как это победить – на настоящий момент – не знаю. Одинаковая картина – если отображать на DBImage и на Image. Причём, если PNG отображать на форме простой загрузкой файла (не через сохранение в БД и последующего чтения), то PNG отображается при этом нормально…
Возможно поможет функция Scanline, но за 1,5 дня безуспешных попыток – готового решения не получилось. Написал о проблеме на форуме, но пока тишина…
Думаю попробовать использовать 4 байт, который предназначен для Альфа канала. Довольно хорошая статья по сканлайн находится здесь.
И ещё одна статья по skyline на английском – достаточно подробная. В общем, надо разбираться в вопросе…
Но надо экспериментировать дальше…
Если у Вас есть готовое решение, пожалуйста, напишите мне на почту panteleevstas@gmail.com
Дело в том, что компонент DBImage – не поддерживает прозрачность. А Image – поддерживает.
Итак, чтобы отображать рисунки с прозрачностью, нужно загружать их в Image следующим образом…
Image в Delphi
Дает отображение графического изображения и обеспечивает работу с изображением
Страница библиотеки Additional
Класс TImage
Иерархия TObiect — TPersistent — TComponent — TControl — TGraphic-Control
Модуль extctrls
Описание
Компонент Image дает отображение на форме графического изображения. Свойство Picture типа TPicture содержит отображаемую графическую составляющюю у которой тип — битовая матрица, пиктограммы, метафайла или определенного пользователем типа. Свойство Canvas позволяет создавать и редактировать изображения.
Во время проектирования загрузить в свойство Picture графический файл можно щелкнув на кнопке с многоточием около свойства Picture в окне Инспектора Объектов или при нажатии дважды на Image. Должно открыться окно Picture Editor, которое позволит загрузить в свойство Picture некоторый графический файл (через кнопку Load), и сохранить открытый файл, дав ему новое имя или сохранить в новом каталоге.
Когда вы в процессе создания проекта сделали загрузку изображения из файла в компонент Image, он не просто отобразит его, но и сохранит загруженное изображение в приложении. Приемущества составляет в том, что ваш проект в целом будет поставляться без отдельного графического файла.
При установке свойства AutoSize равному true, то размер компонента Image будет автоматом подогнан под размер помещенной в image картинки. Если свойство AutoSize установлено в значение false, то изображение может и не уместиться в компонент или же, наоборот, площадь компонента возможно окажется намного больше площади изображения.
Другое свойство — Stretch позволяет реализовать подгонку не компонента под размер рисунка, а сам рисунок под параметр компонента. Но поскольку вряд ли реально в действительности установить размеры Image очень точно пропорциональными величине рисунка, то изображение будет искажено. При установке Stretch равное true может иметь смысл только для каких-то узоров, но не для картинок. Свойство Stretch не действует на изображения пиктограмм, которые не меняют своих размеров.
Свойство — Center, которое установленно в true, делает по центру изображение на площади Image, если параметры размера компонента больше параметра размеров рисунка.
Свойство — Transparent — прозрачность. Если значение Transparent равно true, то изображение в Image будет прозрачным. Это используется при наложения изображений друг на друга. Следует помнить, что свойство Transparent распространяется только на битовые матрицы. При этом прозрачным (т.е. заменяемым на цвет расположенного под ним изображения) делается по умолчанию цвет левого нижнего пиксела битовой матрицы.
Свойство Picture позволяет легко организовать обмен с графическими файлами любых типов в процессе выполнения приложения. Это свойство — объект, который имеет в свою очередь подсвойства, которые указывают на хранящийся графический объект. Если в Picture хранится битовая матрица, на нее указывает свойство Picture.Bitmap. Если хранится пиктограмма, на нее указывает свойство Picture.Icon. На хранящийся метафайл указывает свойство Picture.Metafile. Наконец, на графический объект произвольного типа указывает свойство Picture.Graphic.
Объект Picture и его свойства Bitmap, Icon, Metafile и Graphic имеют методы файлового чтения и записи LoadFromFile и SaveToFile. Для свойств Picture.Bitmap, Picture.Icon и Picture.Metafile формат файла должен соответствовать классу объекта: битовой матрице, пиктограмме, метафайлу. При чтении файла в свойство Picture.Graphic файл должен иметь формат метафайла. А для самого объекта Picture методы чтения и записи автоматически подстраиваются под тип файла.
Например, если вы имеете в приложении компонент-диалог OpenPicture-Dialog, то загрузка в Image выбираемого пользователем графического фала может быть организована оператором
if(OpenPictureDialogl.Execute) then
Загружаемый этим оператором файл может быть любого типа: битовая матрица, пиктограмма или метафайл. Если будут открываться только файлы битовых матриц, то оператор загрузки файла можно заменить на
Imagel.Picture.Bitmap.LoadFromFile(OpenPictureDialogl.FileName);
Для пиктограмм можно было бы использовать оператор
Imagel.Picture.Icon.LoadFromFile(OpenPictureDialogl.FileName);
а для метафайлов — оператор
Imagel.Picture.Graphic.LoadFromFile(OpenPictureDialogl.FileName);
Но во всех этих случаях, если формат файла не совпадет с предполагаемым, возникнет ошибка.
Аналогично работает и метод SaveToFile с тем отличием, что примененный к Picture или к Picture.Graphic он сохраняет в файле изображение любого формата. Например, если вы дополните свое приложение диалогом SavePic-tureDialog, то сохранение изображения в файле можно организовать оператором
if SavePictureDialogl.Execute then
В этом случае пользователь получит возможность сохранить изображение любого формата в файле с новым именем. Только при этом, чтобы не возникало в дальнейшем путаницы, расширение сохраняемого файла все-таки должно соответствовать формату сохраняемого изображения.
Абсолютно идентично для изображений любого формата будет работать программа, если оператор сохранения вы замените на
Imagel.Picture.Graphic.SaveToFile(SavePictureDialogl.FileName);
использующий свойство Picture.Graphic. А если вам известен формат хранимого в компоненте Image изображения, то вы можете применить метод SaveToFile к свойствам Picture.Bitmap, Picture.Icon, и Picture.Metafile.
Для всех рассмотренных объектов Picture, Picture.Bitmap, Picture.Icon, и Picture.Metafile определяют методы присваивания значений объектов Assign.
Однако для BitMap, Icon и Metafile присваивать можно только значения однородных объектов: соответственно битовых матриц, пиктограмм, метафайлов.
При попытке присвоения значениям разнородных объектов будет генерироваться исключение EConvertError. Объект Picture — является универсальным, ему можно присвоить значения объектов любых из остальных трех классов. А значение Picture можно присвоить только тому объекту, тип которого совпадет с типом объекта, хранящегося в нем.
Метод Assign можно использовать и для обмена изображениями с буфером Clipboard.
Например, оператор
Clipboard.Assign(Imagel.Picture);
занесет в буфер обмена изображение, хранящееся в Imagel. Аналогично оператор
Imagel.Picture.Assign(Clipboard);
прочитает в Imagel изображение, находящееся в буфере обмена. Причем это может быть любое изображение, и даже текст.
Надо только не забыть при работе с буфером обмена вставить в оператор uses вашего модуля ссылку на модуль
Clipbrd. Автоматически Delphi эту ссылку не вставляет.
Благодаря наличию канвы Canvas компонент Image широко используется не только для хранения готовых изображений, но и для построения различных графических редакторов.
Основные свойства
Св-во | Объявление / Описание |
AutoSize | property AutoSize: Boolean; Указывает, изменяется ли автомататом размер компонента, подстраиваясь под размер изображения. |
Canvas | property Canvas: TCanvas: Определяет поверхность (холст, канву) для рисования пером Реп и кистью Brush, |
Center | property Center: Boolean; Указывает, должно ли изображение центрироваться в поле компонента, |
Incremen-talDisplay | property IncrementalDisplay: Boolean; Указывает, должно ли изображение частично рисоваться во время медленных операций с большими |
Picture | property Picture: TPicture; Определяет отображаемый графический объект типа TPicture. Может загружаться программно или во время |
Stretch | property Stretch: Boolean; Указывает, должны ли изменяться размеры изображения, подгоняясь под размеры компонента. |
Transparent | property Transparent: Boolean; Указывает, должен ли быть цвет фона изображения прозрачным, чтобы сквозь него было видно |
Основные методы
Событие | Описание |
OnProgress | События происходят при медленных процессах изменения графического изображения и позволяют построить индикатор хода процесса. |
Остальные события наследуются от класса TControl
. delphi создать в классе объект image delphi image Изображения на делфи 7 image delphi canvas работа с изображениями
Работа с JPEG изображением в Delphi
Меня очень часто спрашивают как можно вставить изображение в формате Jpeg в исполняемый модуль или как можно просматривать jpeg-изображения в программе. В этой статье я попробую рассказать и показать на примерах как можно работать со jpeg-изображениями.
Для этих целей в Дельфи предусмотрено два класса TJpegImage и TJpegData. Мы будем использовать первый, он описан в модуле JPEG (его надо подключить в uses).
Теперь попробуем реализовать такую вещь. Сделаем конвертер картинок в формате *.bmp в формат *.jpeg. Для этого нам понадобится такие компоненты: TImage (для просмотра картинок), две кнопки TButton (для открытия диалога выбора картинок и для запуска процесса), TTrackBar (для того чтобы устанавливать качество картинки), TCheckBox (чтобы устанавливать или убирать флаг «Оттенки серого») и TOpenDialog.
Обработчик события OnClick для первой кнопки может иметь такой вид:
Кстати не забудьте настроить фильтр для OpenDialog1, чтобы можно было открывать только картинки в формате *.bmp.
Теперь непосредственно займемся написанием основной части программы, то есть создание jpeg-изображения. Все действия будем производить по щелчку на второй кнопке. Нам необходимо будет создать объект типа TJpegImage, провести с ним необходимые действия, а потом с помощью метода Compress, упаковать изображение и остается только сохранить изображение в файл. Еще необходимо настроить свойства TrackBar’a: свойство Max надо сделать равным 100 и свойство Position равным также 100. Итак, обработчик нажатия на вторую кнопку может быть таким:
Как вы видите все очень просто! На всякий случай приведу полный код приложения:
Для обратного преобразования из Jpg в Bmp необходимо воспользоваться методом DibNeeded.
Как вставить картинку в делфи
Графические возможности Delphi. Image.
Этот компонент служит для размещения на форме одного из трех поддерживаемых Delphi типов изображений: растровой картинки, пиктограммы или метафайла. Любой из этих типов изображения содержится в центральном свойстве компонента — picture. В свойстве canvas содержится канва, с помощью которой при необходимости программа может отредактировать растровое изображение (но не пиктограмму или метафайл!).
property Center: Boolean;
Указывает, надо ли центрировать изображение в границах компонента. Игнорируется, если Autosize=True или если Stretch =True и изображение не является пиктограммой (ICO)
property Canvas : TCanvas;
Содержит канву для прорисовки изображения
property Transparent: Boolean;
Запрещает/разрешает накладывать собственный фон изображения на фон компонента
property Proportional: Boolean; property Stretch: Boolean;
Разрешает/запрещает изменять размер изображения так, чтобы оно целиком заполнило клиентскую область компонента.
property Picture: TPicture;
Разрешает/запрещает пропорционально уменьшать высоту и ширину изображения, если оно не может целиком уместиться в рабочей зоне компонента
property IncrementalDisplay: Boolean;
Разрешает/запрещает показ большого изображения по мере его загрузки Центральное свойство класса. Служит контейнером изображения
Никаких специальных методов у Image нет.
Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.
Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.
Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации. Например, инструкция
загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (imagel).
Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).
Написать программу-фотоальбом, которая позволяет просматривать фотографии и оставлять к ним записи.
Данная программа представляет собой прототип программы-фотоальбома. Она представлена для ознакомления принципа использования Image.