Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906

Узнать изображение в ImageList

13.07.2012, 14:29. Показов 4493. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, собственно вопрос в том, чтобы узнать какое изображение загружено в данный момент в объект Image из ImageList. И вообще возможно ли такое? Даже не обязательно знать стопроцентно какое изображение там находится, хотя бы просто по каким-либо признакам. В частности по цвету. Но в лучшем случае, конечно, полное отождествление.

Добавлено через 3 часа 40 минут
Ура, ура. Вот такая придумалась фигня:
C++
1
2
3
4
for(int i=0; i<=Image1->Width; i++)
  for(int j=0; j<=Image1->Width; j++)
    if(Image1->Canvas->Pixels[i][j] != Image2->Canvas->Pixels[i][j])
     ShowMessage("Not equal");
В принципе пойдет, но а по интереснее ничего что ли нет?

Добавлено через 35 минут
Не то. Это сравнение у двух объектов Image. А как вычленить из ImageList-а изображение для сравнения?

Добавлено через 18 минут
Если только устроить цикл от 0 до ImageList1->Count. И в нем заносить все подряд картинки из imageList-а в темповый Image, а его в свою очередь уже сравнивать с требуемой картинкой.
C++
1
2
3
4
5
6
7
8
9
for(int i = 0; i <= ImageList->Count; i++)
{
Form1->ImageList1->GetBitmap(i, ImageTemp->Picture->Bitmap);
 
for(int x=0; x<=Image1->Width; x++)
  for(int y=0; y<=Image1->Height; y++)
    if(ImageRequired->Canvas->Pixels[x][y] != ImageTemp->Canvas->Pixels[x][y])
      ShowMessage("Nine!");
}
И опять же вопрошаю, есть ли способ поэлегантнее?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2012, 14:29
Ответы с готовыми решениями:

Добавить изображение в ImageList
Вставил ImageList в проект, добавил в опциях(ImageList Editor) картинку. Запустил, а картинки нет. Как исправить?

Анимированные изображение в ImageList
Добрый день, у меня следующая ситуация, создаем инструмент ImageList заносим туда картинки (в том числе анимированные) и кодом в...

Вставить изображение из imageList в Listview
Добрый день, есть у меня имэдж лист в котором есть фотографии, и есть у меня листвью, в который надо вставить изображение из имеджлист

20
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
13.07.2012, 15:54
Цитата Сообщение от SatanaXIII Посмотреть сообщение
узнать какое изображение загружено в данный момент в объект Image из ImageList
почему бы не сохранять индекс картинки в TImageList при её загрузке в TImage?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.07.2012, 16:03  [ТС]
Где ее сохранять? В имя Imag-а лезть не охота, дополнительную структуру/массив или что-то такое вводить не хочется.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
13.07.2012, 16:11
в Image->Tag попробуй
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.07.2012, 16:19
Цитата Сообщение от SatanaXIII Посмотреть сообщение
дополнительную структуру/массив или что-то такое вводить не хочется
По-вашему проще сделать вложеные циклы сравнения, нежели хранить 1 переменную с текущим индексом?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.07.2012, 10:29  [ТС]
mimicria, да. Так как по логике программы эти циклы могут потребоваться или не потребоваться. Выполниться несколько раз или не выполниться вообще. А 1 переменная будет задействована всегда.

Добавлено через 1 час 44 минуты
Ответ здесь:
Изменение картинки при нажатии на BitBtn
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
16.07.2012, 10:56
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Так как по логике программы эти циклы могут потребоваться или не потребоваться. Выполниться несколько раз или не выполниться вообще. А 1 переменная будет задействована всегда.
1 переменная это всего-то байт памяти. Когда потребуется цикл, расходы выйдут гораздо больше.
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
16.07.2012, 11:14
Цитата Сообщение от mimicria Посмотреть сообщение
1 переменная это всего-то байт памяти. Когда потребуется цикл, расходы выйдут гораздо больше.
- совершенно верно! Привыкайте к прагматизму программирования: иногда "некрасивое" определение массива в 16 однородных символов позволяет сэкономить сотни байтов от трансляции кода с использованием анализа, циклов и т.д.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.07.2012, 15:11  [ТС]
Цитата Сообщение от mimicria Посмотреть сообщение
1 переменная это всего-то байт памяти. Когда потребуется цикл, расходы выйдут гораздо больше.
Мне не жалко потратить пару лишних секунд на создание проекта. А вот уже в запущенной программе этих пары секунд может и не быть. А может и быть. Типа ткнул на кнопку - запустились, отработали, почистили за собой; не ткнул - прошли лесом. А
Цитата Сообщение от nick42 Посмотреть сообщение
16 однородных символов
будут постоянно висеть в памяти. Пока работает программа. Вечность! И миллиарды таких программ. Объединенных в сеть и управляющих ядерным оружием. И слезы вдов!..
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
16.07.2012, 17:11
... схоластика.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.07.2012, 22:24
Это не схоластика, это уже просто треп.
SatanaXIII, не надо городить огород. Сравнение графических объектов и сравнение двух байтов - вещи просто несопоставимые. Последнее куда как логичнее и эффективнее при любом раскладе.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
17.07.2012, 09:04  [ТС]

Не по теме:

nick42, при чем тут религия? Ну я еще соглашусь более-менее на софизм.


Не по теме:

Цитата Сообщение от BRcr Посмотреть сообщение
просто треп.
И я о том.


BRcr, ну а можно мне в картинках поведать почему? Я, не подумайте, не берусь пока говорить кто прав, кто не прав. Я не Страуструп (хотя почему то мне кажется, что среди вас его тоже нет). Давайте аргументированно.
Мои тезисы:
За/ПротивДополнительные проверки Введение переменных
Обрабатываются только один раз при сборке формы + -
Хавают память - +
Сложнее и дольше обрабатываются + -

Замечания, предложения?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.07.2012, 09:57
Замечаний ажно на все три пункта. Это не совсем критика, действительно замечания - заметил, сказал.
Что там про обработку однократную? Почему вспомогательные переменные не могут "обрабатываться" таким же образом?
"Хавают память" - мощно сказано. Только вот про лишний байтик так говорить несколько неуместно.
Сложность и скорость обработки - кто в этом плане имеет преимущество? Что-то неясно из таблички...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
17.07.2012, 10:56  [ТС]
Ну отлично. Супер. Уже что-то конструктивно.
Теперь побольше повествовательных предложений и вообще будет хорошо.
Давайте я начну:
Про однократную обработку - по принципам объектно-ориентированного программирования система у нас будет решать когда выполнить те проверки, а когда не надо. Я имею ввиду что во время работы программы конкретно тот участок кода, где содержится данная проверка, не будет выполнен. На него не будут тратиться ни время ни ресурсы. Операционная система будет ожидать события, по которому она должна выполнить проверки. И при чем события вызова проверок могут никогда не наступить.
Про лишний байтик так говорить неуместно? А почему бы и нет? Ну будет у меня пять лишних байт просто простаивать. Объявлены, но никогда не использоваться. Ну будет десять, миллион или же наоборот один. Это все равно больше чем ноль. Понятно, что для современных компьютеров это не принципиально (если не рассматривать вариант про миллион). Но, повторюсь, почему бы вовсе не использовать лишнюю память, коли такое возможно? Да и опять же байтик туда, байтик сюда.
Сложность и скорость обработки. Тут бесспорно выигрывают байтики. В проверках тяжеловесные конструкции с перебором объектов формы - это уже сильно перевешивает.

В табличке только приблизительные аспекты сравнения. Что мне на первый взгляд посчиталось наиболее важным. Пожалуйста вводите новые сравнения, по другим параметрам. Оспаривайте мои суждения. Приводите свои. Главное ведь докопаться до истины.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.07.2012, 11:35
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Про однократную обработку (...)
Ну, и как это разграничивает преимущества подходов?
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Про лишний байтик (...)
Не пользуйся vcl - там миллионы лишних байтиков.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
почему бы вовсе не использовать лишнюю память, коли такое возможно?
Потому что лучше экономить свое время. И потому что любой код, имеющий место быть в твоем экзешнике - даже тот, что может никогда и не выполниться, при запуске программы на исполнение так и так транслируется в ее адресное пространство, занимая память - точно так же, как и дополнительные переменные.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
17.07.2012, 12:04  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Ну, и как это разграничивает преимущества подходов?
Еще раз пожалуйста.
Цитата Сообщение от BRcr Посмотреть сообщение
Не пользуйся vcl - там миллионы лишних байтиков.
Не, не, не. Такие отмазки не катят. Давайте тогда все перейдем на ассемблер, а форум продолжим на глиняных табличках. Мы щас про разницу конкретно в тех двух случаях.
Цитата Сообщение от BRcr Посмотреть сообщение
код, имеющий место быть экзешнике занимет память - точно так же, как и дополнительные переменные
Согласен полностью.

...сообщение обжигается. Ждите.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.07.2012, 16:29
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Еще раз пожалуйста.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Про однократную обработку - по принципам объектно-ориентированного программирования система у нас будет решать когда выполнить те проверки, а когда не надо. Я имею ввиду что во время работы программы конкретно тот участок кода, где содержится данная проверка, не будет выполнен. На него не будут тратиться ни время ни ресурсы. Операционная система будет ожидать события, по которому она должна выполнить проверки. И при чем события вызова проверок могут никогда не наступить.
Два подхода, о которых речь - использование дополнительных переменных для индикации текущего состояния графики и непосредственный анализ графических данных в тех же целях.
В контексте приведенных цитат, в чем разница для двух подходов? Какое преимущество получает тот или иной, если код проверки графики так никогда и не будет выполнен?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
17.07.2012, 17:01  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Два подхода, о которых речь - использование дополнительных переменных для индикации текущего состояния графики и непосредственный анализ графических данных в тех же целях.
Абсолютно верно.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
И при чем события вызова проверок могут никогда не наступить.
А могут наступить. А дополнительные переменные у нас уже инициализированы. Нарисую картинку для наглядности:
Миниатюры
Узнать изображение в ImageList  
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.07.2012, 19:45
Инициализированы они или нет - значения не имеет, главное, что память под них выделена.
Теперь касательно памяти. Сколько займут переменные? Несколько байт, которые странным образом очень хочется сохранить. Сколько займет сам код, требуемый для анализа графики? Вряд ли много, но не меньше тех же нескольких байт. Сколько займет код, требуемый для анализа переменных? Минимум он займет, буквально несколько ассемблерных команд.
Где экономия?

Не по теме:

Даже над картинкой потрудился.:D Не жалко времени на такую ерунду?

1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
18.07.2012, 10:37  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Инициализированы они или нет - значения не имеет, главное, что память под них выделена.
Хорошо. Для использующихся в проверках переменных (для циклов, флаги и прочее) выделяем память динамически. Выделили, отработали, удалили. (А те висят )

Цитата Сообщение от BRcr Посмотреть сообщение
Теперь касательно памяти. Сколько займут переменные? Несколько байт...
Теперь используем динамически создающиеся объекты-картинки и для каждой, для точного отождествления, используем какую-нибудь структуру. Итого у нас диманически расширяющийся массив структур.
Ну это я так, для красного словца, - ведь в методе задействования переменных может быть использовано и не пару байт, а более.
А код для проверок займет ровно столько же, сколько и занимал. (Ну может за исключением единственного параметра максимального индекса массива)

Итак, мы имеем с одной стороны динамически расширяющийся массив, пожирающий и никогда не отдающий память, а с другой стороны - маленький аккуратный кусочек кода, который где-то лежит у нас на пыльной полке.


Цитата Сообщение от BRcr Посмотреть сообщение
Не по теме:
Даже над картинкой потрудился. Не жалко времени на такую ерунду?
А как же! Главное донести ведь свою мысль. Наглядность и простота понимая. Разве не за этим мы здесь? В следующий раз песню спою.
P.S. Красивая картинка получилась?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2012, 10:37
Помогаю со студенческими работами здесь

Добавить изображение на итем listview через imagelist
в ручную если добавляю картинку в imagelist и ставлю в итеме нужный индекс, то картинка появляется в итеме listview . Программно такое...

Как вывести изображение c прозрачностью из ImageList в Image?
Для вывода изображения из ImageList в Image использую: procedure TForm1.Button1Click(Sender: TObject); begin ...

Как узнать путь картинки из imagelist
Мне нужен путь, где находиться этот рисунок. Наподобии: c:\myprog\ris.ico Только вот как узнать этот путь у imagelist&quot;а ? ...

Выбрать изображение с компьютера, занести его в ImageList и сохранить между запусками
Необходимо выбрать изображение с компьютера и занести его в ImageList (это получилось) Но при закрытии программы все занесенные картинки...

Как вывести на form изображение используя ImageList указав ссылку только на папку с ними?
Проблема в том, что мне нужно вывести на форму изображение слева и справа текст (ссылку), находящиеся в ListView. С текстом я разобрался,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru