TImagelist не добавляет растровое изображение

Я на моем конце... пытаюсь получить пользовательский список картинок, TImageList и TListView для совместной работы. Исходная проблема: динамически добавленные изображения не отображаются в списке. Сузили, проблема в TImagelist. Код ниже. ilMain - это TImagelist (определенный в другом месте). Добавление растрового изображения в список, немедленное получение его, сначала "Draw" работает нормально, но sedond не работает... что мне здесь не хватает?

var i:integer;
  test:TSch;
  currentimage :TBitmap;
  stupid :TBitmap;

begin
  currentImage:=TBitmap.Create;
  stupid:=TBitmap.Create;
  ilMain.Clear;
//  currentImage.LoadFromFile('C:\Delphi\piccat\pics\MonaLisa.jpg');
  JPeg2Bmp('C:\Delphi\piccat\pics\MonaLisa.jpg',currentImage);

  form1.canvas.Draw(100,10,currentimage);
  ilMain.Add(currentimage,nil);
  ilMain.GetBitmap(0,stupid);
  form1.canvas.Draw(200,10,stupid);

РЕДАКТИРОВАТЬ:

Сделано дальнейшее тестирование на этом; результаты очень запутанные и противоречивые.

Результат на самом деле ОТЛИЧНО зависит от размера входного файла (спасибо за этот указатель, kobik!); кажется, что все, что меньше 256x256, не импортируется в список изображений, в то время как большие изображения ПО X-AXIS (иногда??) распределены по нескольким элементам.

ilMain был установлен на 256x256 пикселей.

Вот вывод для нескольких входных размеров (X x Y, в пикселях): 950x414 Во время первого рисования отображается все изображение, во втором - 256x256 пикселей в верхнем левом углу. ОДНАКО ТРИ элемента списка TImagelist заполняются с размерами 3x 256x256 пикселей: три изображения, которые можно "вырезать" из основного изображения и при этом иметь размер 256x256 пикселей. Все обрезанные края, меньшие, либо вертикальные, либо горизонтальные, чем 256x256, теряются.

1600x1600 Шесть изображений импортированы; первый ряд полных 256х256 блоков, которые можно вырезать сверху рисунка. Неполный блок справа от tp опущен, и все строки ниже 256 размера Y также.

1500x1000 Аналогично предыдущему; пять предметов импортированы сейчас.

638x376 Снова похоже; только два элемента "подходят" сейчас.

197x256 (мой исходный тестовый файл, описанный в посте выше) НЕТ ИМПОРТОВ (размер X меньше размера TImaglist X?)

256x256 СНОВА, НЕТ ДАННЫХ

257x257 ВСЕ ЕЩЕ НЕ ДАННЫЕ

260x260 ВСЕ ЕЩЕ НЕ ДАННЫЕ

300x300 ВСЕ ЕЩЕ НЕ ДАННЫЕ

512x256 Очень странный. Одна картинка импортирована; НО он уменьшен в размере, поэтому примерно 70% исходного изображения соответствует (новому) размеру 256 X. Черная полоса добавлена ​​под картинкой, чтобы восполнить потерянное пространство из-за этого сокращения.

Так что это то место, где я сейчас прекращаю тестирование и задаюсь вопросом, может ли кто-нибудь пролить здесь немного света?

РЕДАКТИРОВАТЬ: Дизайн часть переехала в новый вопрос (см. Запрос в комментарии, Кобик, спасибо человек!)

1 ответ

Ваш код работает (или, по крайней мере, должен работать), предполагая, что JPeg2Bmp верно. Я думаю, что второй комментарий @ Димы правильный.

Вы не показали ilMain свойства, и если вы используете по умолчанию, вы получите список изображений с Width/Height=16,

Попробуйте пропустить первый звонок form1.canvas.Draw(100,10,currentimage); и нарисуйте только form1.canvas.Draw(200,10,stupid); и вы должны увидеть 16x16 рисунок в позиции 200,10.

TImagelist не может загрузить изображения произвольного размера.
Вам необходимо заранее определить его размер и загрузить растровые изображения подходящих размеров. т.е. создавать миниатюры, чтобы соответствовать размерам списка изображений.

Обратите внимание, что (вы, вероятно, знаете, что) Вам нужно рисовать только в ответ на WM_PAINT Сообщение. например, в форме OnPaint событие.

РЕДАКТИРОВАТЬ: Что касается вашего редактирования, это как TImageList работает. если вы добавите растровое изображение, которое больше ширины списка изображений, оно будет пытаться разбить растровое изображение на отдельные растровые изображения, чтобы соответствовать размеру списка изображений. это по замыслу.

Смотрите документацию о ImageList_Add о hbmImage параметр:

Дескриптор растрового изображения, которое содержит изображение или изображения. Количество изображений определяется по ширине растрового изображения.

Другие вопросы по тегам