TImagelist не добавляет растровое изображение - PullRequest
0 голосов
/ 24 декабря 2018

Я на моем конце ... пытаюсь получить пользовательский список картинок, 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);

EDIT:

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

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

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

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

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

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

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

197x256 (мой оригинальный тестовый файл, описанный в посте выше) НЕТ ПРЕДМЕТОВ ИМПОРТИРОВАТЬ (X-размер меньше, чем TImaglist X-size?)

256x256 СНОВА, НЕТ ДАННЫХ ИМПОРТИРОВАТЬ

257x257 И ВСЕГО ДАННЫХ НЕ ИМПОРТИРОВАТЬ

260x260 ВСЕГО ДАННЫХ НЕ ИМПОРТИРОВАТЬ

300x300 ВСЕГО ДАННЫХ НЕ ИМПОРТИРОВАТЬ

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

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

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

1 Ответ

0 голосов
/ 25 декабря 2018

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

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

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

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

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

EDIT: Что касается вашего редактирования, то вот как работает TImageList.Если вы добавите растровое изображение, которое больше ширины списка изображений, попытается разбить растровое изображение на отдельные растровые изображения, чтобы соответствовать размеру списка изображений.это специально.

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

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

...