Перейти к содержанию
  • Регистрация
  • 0
krapotkin

Png в TImage из TImageList

Вопрос

В примере по TImageList фигурирует TGlyph, который к нему подключен напрямик.

 

А как старым способом достать оттуда нужный битмап, точнее png?

Dbzb2Rbv.png

заинтересовало, почему в красной рамке 16 x 16; пробовал менять на 64 x 64

код 

sz.cx:=64;
sz.cx:=64;
img1.Bitmap:=il2.Bitmap(sz,0);

16x16 imageWrapMode = Fit

Dbzb2Rbw.png

64x64 imageWrapMode = Fit

Dbzb2Rbx.png

16x16 imageWrapMode = Center

 

Dbzb2RbB.png

64x64 imageWrapMode = Center

Dbzb2Rbz.png

 
что-то ни один вариант не нравится
еще картинка явно вылазит из самого TImage O_O
 
как же правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

дополнение

красная рамка по-прежнему не понята мной

но размер картинки на выходе зависит от SZ

т.е. подогнать ее к нужному размеру я подогнал, но хотелось бы и смысл шаманства узнать

я думал,что Fit за меня должен все это сделать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Если дважды кликнуть на картинку в разделе Selected Image, или Source of Images то можно увидеть редактор TMultiresBitmap.

Дело в том, что каждая картинка может иметь несколько вариантов которые адаптированы под разные масштабы. В Selected Image всегда задаются размеры для масштаба 1.

Когда добавляется новая картинка которая имеет характерные размеры кратные 8 то для неё автоматически выбирается масштаб исходя из того, что картинка в масштабе 1 имеет размеры 16x16. Потом Вы можете добавить еще несколько изображений.

post-64-0-23865400-1437163147_thumb.png

Да размер картинки на выходе зависит от того размера, который укажете. Из нескольких картинок будет выбран наиболее подходящий вариант и вписан в указанные размеры с сохранением пропорций.

 

Например рисовать можно так:

procedure TForm25.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
begin
  ImageList1.Draw(Canvas, TRectF.Create(10, 10, 32, 34), 0, 1);
end;
post-64-0-67998800-1437163119.png

Я не совсем понял что значит старым способом, но до исходных картинок можно добраться примерно так

  ImageList1.Source[0].MultiResBitmap.Items[0].Bitmap;

Есть небольшая статья. Также есть демка ImageListDemo.dpr, которая должна по идее входить в состав Delphi.

post-64-0-67998800-1437163119.png

post-64-0-23865400-1437163147_thumb.png

Изменено пользователем RoschinSpb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

>>но хотелось бы и смысл шаманства узнать

>>я думал,что Fit за меня должен все это сделать...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Есть пример от Sarina Dupont

там ставится маркер по клику на MapView

картинка на маркер берется из TImage

MarkerDescr.Icon := Image1.Bitmap;

я хотел заменить источник картинок с Timage на TImageList

и пошли всякие непонятные пока моменты - по аналогии со старым ImageList

брал Imagelist.GetBitmap(sz,0) - нет видимого результата

стал параллельно копировать это же в Timage - в нем есть (с описанными эффектами), но присвоить на маркер - Segmentation Fault

 

вариант

ImageList1.Source[0].MultiResBitmap.Items[0].Bitmap;

вроде подходит...

 

P.S.

Может, тогда объясните заодно. Если самому создать битмап, закрасить его, например, красным, то в Image он копируется хорошо, в marker.Icon - не работает

в лучшем случае, мусор показывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Может, тогда объясните заодно. Если самому создать битмап, закрасить его, например, красным, то в Image он копируется хорошо, в marker.Icon - не работает

в лучшем случае, мусор показывает.

Что такое marker? Если TMapMarkerDescriptor, то это Record. Icon это просто поле которое ссылко на объект. Если объект будет уничтожен, то мы получим Access Violation.

TImageList в Fire Monkey не имеет метода GetBitmap. Зато есть метод Bitmap. О котором можно прочитать в документации: FMX.ImgList.TCustomImageList.Bitmap в частности

Returns the TBitmap object, in the cache, containing the image referenced with Index in the Destination collection and having the specified Size.

...

Because the TCustomImageList component can automatically destroys the TBitmap objects that are returned by Bitmap, in the internal cache; therefore, you must not:

  • Store references to returned TBitmap objects.
  • Destroy returned TBitmap objects explicitly.

 

 

Кроме того в предложенной статье написано:

Bitmap – возвращает изображение указанного размера с указанным номером. Если изображения не существует, то возвращается nil. Обратите внимание, что полученное значение нельзя самостоятельно разрушать и хранить как ссылку. Потому что это одно из значений находящихся в кэше изображений, оно всегда создается и разрушается средствами TImageList. Если вам просто нужно нарисовать некоторую картинку, используйте метод Draw. Если все-таки требуется сохранить полученное изображение для дальнейшего использования, можно создать новый экземпляр TBitmap и воспользоваться методом Assign.

Т.е. в отличии от VCL-ного TImageList, в FMX, он не имеет постоянного размера. В зависимости от того, какой размер нам нужен будет сгенерирована картинка TBitmap растянутая/сжатая до нужных размеров с сохранением пропорций. Чтобы это не занимало слишком много времени последние сгенерироваyные картинки хранятся во внутреннем буфере из которого они могут "выталкиваться".

В Image (как и для большинства классов) при присваивании экземпляра какого-нибудь объекта в сеттере вызывается метод Assign, т.е. копируется не ссылка на объект, а копируются данные. В этом случае нас не интересует дальнейшая судьба исходного объекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...