Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2014, 15:13   #1
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию Копирование картинки из одного Image в другой Image

Доброго времени суток!
Помогите скопировать картинку из одного Image в другой.
На форме есть два Image. Один Image1 виден и картинка в нем периодически меняется (грузится из файла). А другой Image2 не виден, но картинка в нем загружена постоянно на этапе проектирования.
Надо скопировать из Image2 в Image1 картинку.
На просторах инета нашел обсуждение этого вопроса, но решение меня не устраивает.
Может можно как то проще это сделать?
При этом свойства оставить как и были, а копировать только картинку.
Oleg_SS вне форума Ответить с цитированием
Старый 21.05.2014, 16:36   #2
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Сначала инициализируем в OnCreate формы те имаджи, в которых ещё нет картинок
Код:
Image1.Picture.Graphic := TJpegImage.Create; // Png, Bmp по ситуации
И в нужном участке кода копируем
Код:
Image1.Picture.Graphic.Assign(Image2.Picture.Graphic);
Устраивает?
P.S. Использовать скрытый Image, как контейнер для хранения картинки, это не правильно. Существует ImageList, сторонний PngImageList, а так же ресурсы для хранения любого контента.

Последний раз редактировалось doktor255; 21.05.2014 в 16:40.
doktor255 вне форума Ответить с цитированием
Старый 21.05.2014, 17:08   #3
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию

Решено.
Изначально вставлял JPG, а копировать пытался BMP
Image1.Picture.Bitmap := Image2.Picture.Bitmap;
Загрузил BMP и все получилось.

Ваш пример тоже получился

Да согласен, что так хранить это дурной тон, но мне кажется, что чем проще, тем лучше.
Спасибо!

Последний раз редактировалось Oleg_SS; 21.05.2014 в 17:22.
Oleg_SS вне форума Ответить с цитированием
Старый 21.05.2014, 17:23   #4
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию

А как скопировать из ImageList?
Делаю так:
ImageList_Menu.GetBitmap(10, Image1.Picture.Bitmap)
Тоже все получается, НО
картинка искаженная, т.к. при загрузке в ImageList она уменьшается в размерах.
Если при загрузке картинки на этапе проектирования сказать, что разбить на несколько фрагментов, то тогда я не знаю, как все это собрать в одну картинку.

Последний раз редактировалось Oleg_SS; 21.05.2014 в 17:36.
Oleg_SS вне форума Ответить с цитированием
Старый 21.05.2014, 18:14   #5
doktor255
Заблокирован
 
Регистрация: 31.03.2011
Сообщений: 976
По умолчанию

Цитата:
картинка искаженная, т.к. при загрузке в ImageList она уменьшается в размерах.
Чушь. У ImageList есть свойства width, height, которые определяют размеры ВСЕХ изображений, загруженных в него. Если ограничение по размеру не утраивает, то можно использовать ресурсы. Там без разницы что хранить, и какого размера.
Цитата:
Image1.Picture.Bitmap := Image2.Picture.Bitmap;
Категорически не согласен. Обьясняю почему. При присвоении одного битмапа другому, копирования, как такового не происходит, а происходит присвоение участка памяти, хранящего изображение. В итоге при изменении картинки любого из Image автоматически изменится картинка и во втором, ибо контейнер один.

Последний раз редактировалось doktor255; 21.05.2014 в 18:17.
doktor255 вне форума Ответить с цитированием
Старый 22.05.2014, 04:37   #6
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию

Цитата:
Сообщение от doktor255 Посмотреть сообщение
Чушь. У ImageList есть свойства width, height, которые определяют размеры ВСЕХ изображений, загруженных в него. Если ограничение по размеру не утраивает, то можно использовать ресурсы. Там без разницы что хранить, и какого размера.
Спорить не буду. Согласен.
Цитата:
Категорически не согласен. Обьясняю почему. При присвоении одного битмапа другому, копирования, как такового не происходит, а происходит присвоение участка памяти, хранящего изображение. В итоге при изменении картинки любого из Image автоматически изменится картинка и во втором, ибо контейнер один.
А тут вы не правы. Именно копируется, т.к. при изменении Imeg1 и последующем копировании картинки из Image2 все нормально.
Можно долго думать как это устроено, но лучше проверьте на практике.
Oleg_SS вне форума Ответить с цитированием
Старый 22.05.2014, 06:59   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

doktor255, там не просто указатель наружу выставлен, а свойство с сеттером, а в этом сеттере вызывается Assign, который именно копирует данные (рисованием), а не указатель.
У многих элементов VCL подобное поведение и реализация, у шрифтов, например, за обычным присвоением скрывается много чего, ибо свойства.
phomm вне форума Ответить с цитированием
Старый 22.05.2014, 07:30   #8
Oleg_SS
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 75
По умолчанию

В общем разобрались.
Всем спасибо!
Oleg_SS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При столкновении между image переместить другой Image Алексей_2012 Общие вопросы Delphi 1 07.03.2013 09:32
Замена одного цвета в Image на другой KREGI Мультимедиа в Delphi 13 09.06.2012 18:05
маштабирование картинки в image wulf_01 Помощь студентам 4 15.05.2011 19:51
Image одной формы = Image другой формы DimR Microsoft Office Excel 2 21.04.2010 23:08
Перенос из одного Image в другой Dimitriys Компоненты Delphi 5 14.07.2007 23:32