krapotkin Опубликовано 17 июля, 2015 Поделиться Опубликовано 17 июля, 2015 В примере по TImageList фигурирует TGlyph, который к нему подключен напрямик. А как старым способом достать оттуда нужный битмап, точнее png? заинтересовало, почему в красной рамке 16 x 16; пробовал менять на 64 x 64 код sz.cx:=64; sz.cx:=64; img1.Bitmap:=il2.Bitmap(sz,0); 16x16 imageWrapMode = Fit 64x64 imageWrapMode = Fit 16x16 imageWrapMode = Center 64x64 imageWrapMode = Center что-то ни один вариант не нравится еще картинка явно вылазит из самого TImage O_O как же правильно? Цитата Ссылка на комментарий
0 krapotkin Опубликовано 17 июля, 2015 Автор Поделиться Опубликовано 17 июля, 2015 дополнение красная рамка по-прежнему не понята мной но размер картинки на выходе зависит от SZ т.е. подогнать ее к нужному размеру я подогнал, но хотелось бы и смысл шаманства узнать я думал,что Fit за меня должен все это сделать... Цитата Ссылка на комментарий
0 RoschinSpb Опубликовано 17 июля, 2015 Поделиться Опубликовано 17 июля, 2015 (изменено) Если дважды кликнуть на картинку в разделе Selected Image, или Source of Images то можно увидеть редактор TMultiresBitmap. Дело в том, что каждая картинка может иметь несколько вариантов которые адаптированы под разные масштабы. В Selected Image всегда задаются размеры для масштаба 1. Когда добавляется новая картинка которая имеет характерные размеры кратные 8 то для неё автоматически выбирается масштаб исходя из того, что картинка в масштабе 1 имеет размеры 16x16. Потом Вы можете добавить еще несколько изображений. Да размер картинки на выходе зависит от того размера, который укажете. Из нескольких картинок будет выбран наиболее подходящий вариант и вписан в указанные размеры с сохранением пропорций. Например рисовать можно так: procedure TForm25.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin ImageList1.Draw(Canvas, TRectF.Create(10, 10, 32, 34), 0, 1); end; Я не совсем понял что значит старым способом, но до исходных картинок можно добраться примерно так ImageList1.Source[0].MultiResBitmap.Items[0].Bitmap; Есть небольшая статья. Также есть демка ImageListDemo.dpr, которая должна по идее входить в состав Delphi. Изменено 17 июля, 2015 пользователем RoschinSpb Rusland 1 Цитата Ссылка на комментарий
0 RoschinSpb Опубликовано 17 июля, 2015 Поделиться Опубликовано 17 июля, 2015 >>но хотелось бы и смысл шаманства узнать >>я думал,что Fit за меня должен все это сделать... Давайте для начала выясним, что вы хотите сделать. Исходя из этого будем определять смысл и способ шаманства. Если надо просто в определенном месте расположить картинку из TImageList, то используйте TGlyph, который создан специально, чтобы избежать всякого рода танцев с бубнами. Цитата Ссылка на комментарий
0 krapotkin Опубликовано 20 июля, 2015 Автор Поделиться Опубликовано 20 июля, 2015 Есть пример от 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 RoschinSpb Опубликовано 20 июля, 2015 Поделиться Опубликовано 20 июля, 2015 Может, тогда объясните заодно. Если самому создать битмап, закрасить его, например, красным, то в 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, т.е. копируется не ссылка на объект, а копируются данные. В этом случае нас не интересует дальнейшая судьба исходного объекта. Равиль Зарипов (ZuBy), xenon54 и krapotkin 3 Цитата Ссылка на комментарий
Вопрос
krapotkin
В примере по TImageList фигурирует TGlyph, который к нему подключен напрямик.
А как старым способом достать оттуда нужный битмап, точнее png?
заинтересовало, почему в красной рамке 16 x 16; пробовал менять на 64 x 64
код
16x16 imageWrapMode = Fit
64x64 imageWrapMode = Fit
16x16 imageWrapMode = Center
64x64 imageWrapMode = Center
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.