Перейти к содержанию
brunnengi

[Android] [XE7] Какой компонент выбрать для карты?

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

Здравствуйте.

Хочу загнать карту в приложение. Т.е. сделать ПринтСрин нескольких участков, слить их в одно изображение в фотошопе, а потом иметь возможность просматривать на смартфоне под android. Что бы можно было пальцами приблизить, подвигать карту.

Какой компонет посоветуете?

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


Ссылка на сообщение
Поделиться на другие сайты
  1. Компонента, который умеет масштабировать изображение и перемещать изображение пальцем, нету. Поэтому такой придется сделать самостоятельно.
  2. Я бы не стал брать TImage за основу, так как на всех мобильных платформах у TBitmap есть ограничение на максимально допустимый размер. Он равен максимально допустимому размеру текстуры на текущем устройстве и зависит от возможностей телефона. А так как исходник карты может быть очень большим, то карта просто не поместиться в TBitmap.
  3. Чтобы хранить большее изображение нужно использовать TBitmapSurface.
  4. Самый лучший вариант это хранение карты по частям и до загрузка требуемых частей по мере прокручивания карты и изменении масштаба. При таком подходе можно будет части хранить в  TBitmap и использовать отрисовку штатным способом TCanvas.DrawBitmap. Если части больше не отображаются, то их можно будет выгружать, чтобы не занимать лишнюю память.

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


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

 

  1. ...
  2. ... Он равен максимально допустимому размеру текстуры на текущем устройстве...
  3. ...
  4. ...

 

 

А как узнать этот самый максимально допустимый размер?

 

Я посоветовал TImage, потому что сам решил аналогичную задачу (только у меня была не карта, а изображение с web-камеры) используя именно его. И проблем пока не замечено. Но с учетом Ваших пояснений я начинаю думать, а не переделать ли мне это на TBitmapSurface.

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


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

Как узнать поддерживаемый максимально допустимы размер изображения в TBitmap?

Смысл переписывать имеет, если вам нужно загружать очень большие изображения, где-то более 2-3 Mb.

 

P.S. На Windows с DirectX 10, размер вообще 64 Mb

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


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

 

  1. ...
  2. ...
  3. Чтобы хранить большее изображение нужно использовать TBitmapSurface.
  4. Самый лучший вариант это хранение карты по частям и до загрузка требуемых частей по мере прокручивания карты и изменении масштаба. При таком подходе можно будет части хранить в  TBitmap и использовать отрисовку штатным способом TCanvas.DrawBitmap. Если части больше не отображаются, то их можно будет выгружать, чтобы не занимать лишнюю память.

 

 

Извиняюсь за отсутствие, просто начал собирать карту в один кусок, оказалось то это весьма трудоемкий процесс, пришлось искать средства автоматизации процесса. Так что только сегодня получил примерное представление об объеме карты.

Одна карта слитая в один jpg файл, с 20 кратным увеличением вести 70МБ, причем там не все ее части ещё в нормальном качестве, большая часть еще смазана.

Значит итоговая будет весит куда больше.

 

Теперь по алгоритму вопросы.

Эту карту одним файлом надо загнать в TBitmapSurface? Потом подгружать из него в TBitmap?

И как организовать прокрутку с одновременном подгрузкой?

И что делать если мне надо что бы масштаб стал другим, .т.е увидеть зону не с 20 кратным приближением а с 14 кратным допустим?

Мне надо еще и такую карту залить? Или если уже храниться карта в хорошем разрешении этого можно избежать?

 

P.S. 

У меня на телефоне показало 4096. Это 4096 его именно? Высота картинки в pixels?

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


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

Это значит, что картинка должна быть не более 4096 х 4096.

 

Идея загружать всю картинку сразу будет фатальна для Андроида с ограниченной памятью и закончится OutOfMemoryException. Поэтому вам нужно идти путем подгрузки в рантайме только тех тайлов (частей карты), которые необходимый сейчас для демонстрации. И выгрузке тех тайлов, которые не отображаются и не нужны на экране. Аля простой вариант он-лайн карт.

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


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

Здравствуйте, я тоже хочу сделать карту но поверх картографических рисунков нужно добавить векторные графики как например дорогу и еще вы посоветовали TBitmapSurface что это как с ним работать? 

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


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

В XE8 добавлен новый компонент TMapView, который позволяет отобразить карту в вашем приложении и не только. Поддерживаемые платформы: Android и iOS.

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


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

 

В XE8 добавлен новый компонент TMapView, который позволяет отобразить карту в вашем приложении и не только. Поддерживаемые платформы: Android и iOS.

 

 

Ярослав, Вы забыли указать, что компонент допускает в бесплатном варианте до 1000 сессий, потом он не будет работать.

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


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

masmat, что за ограничение значит 1000 сессий? О чем вы? Речь про сам компонент или про ограничения сервиса Google Maps?

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


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

masmat, что за ограничение значит 1000 сессий? О чем вы? Речь про сам компонент или про ограничения сервиса Google Maps?

В компоненте TMapView можно использовать только карту Google Map, другие не удавалось подключить (пробовал в XE 8.1)

Так вот, по лицензионной политике Google при превышении порога в 1000 запросов (не помню то ли в день, то ли в месяц) карта работать перестанет. Нужно будет покупать лицензию.

Так было на октябрь 2015 года. Может сейчас политика Google изменилась, нужно уточнять.

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


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

Во-первых, сам компонент здесь ни при чем.

Во-вторых, ограничение 1000 бесплатных запросов (а не сессий) в день касается Google Places API for Android, а не самого Google Maps Android API

Пруфлинк https://developers.google.com/maps/pricing-and-plans/?hl=ru

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


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

Rusland абсолютно прав, я делал более 1000 запросов за сутки.  Google Maps Android API не имеет ограничений в бесплатной версии.

Делал карты ещё до появления MapView. Использовал TWebbrowser :mellow:

А так же PaintBox для загрузки локальных карт в формате OZI

Как по мне, PaintBox удобнее Image

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


Ссылка на сообщение
Поделиться на другие сайты
Черновой вариант, использую в Windows. На сколько адаптировано к Android не знаю, не компилил


procedure TMap.FullScreen(Image:TImage;Tile:TOSMTile);
var
  I: Byte;
  j: Integer;
  BMPTile, BMPImage:TBitmap;
  rctIn, rctOut:TRectF;
  S:String;
begin
  rctOUT:= TRectF.Create(0,0,255,255);
  BMPImage  := TBitmap.Create;
  BMPImage.Width    := Round(Image.Width);
  BMPImage.Height   := Round(Image.Height);
  BMPTile := TBitmap.Create;
  if not DirectoryExists(FPathTile+IntToStr(Tile.Zoom)) then
    ForceDirectories(FPathTile+IntToStr(Tile.Zoom));
  for I := 1 to FTileWidth do
    for j := 1 to FTileHeight do
    begin
      S:= FPathTile+format('%d\%d\%d.png',[Tile.Zoom,Tile.TileX+i-1,Tile.TileY+j-1]);
      while  Assigned(FHTTP) and not FileExists(S)  do
      begin
        if not DirectoryExists(FPathTile+IntToStr(Tile.Zoom)+'\'+IntToStr(Tile.TileX+i-1)) then
          ForceDirectories(FPathTile+IntToStr(Tile.Zoom)+'\'+IntToStr(Tile.TileX+i-1));
        LoadURLToFile(S, 'http://b.tile.openstreetmap.org/'+format('%d/%d/%d.png',[Tile.Zoom,Tile.TileX+i-1,Tile.TileY+j-1]), FHTTP);
      end;
      if FileExists(S) then
      begin
        rctIn := TRectF.Create(256*(i-1),256*(j-1),256*(i),256*(j));
        BMPTile.LoadFromFile(S);
        BMPImage.Canvas.BeginScene();
        BMPImage.Canvas.DrawBitmap(BMPTile,rctOut,rctIn,100,True);
//        BMPImage.Canvas.Fill.Kind := TBrushKind.None;
//        BMPImage.Canvas.DrawRect(TRectF.Create(0,0,FScreenWidth, FScreenHeight),0, 0, AllCorners, 100);
        BMPImage.Canvas.EndScene;
      end

    end;
    Image.Bitmap:= TBitmap.Create;
    Image.Bitmap.Clear($FFFFFFFF);
    Image.Bitmap.Assign(BMPImage);
end;

Отредактировал Alexander

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


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

Идея была в следующем. В TImage не помещалась карта(состоящая из тайлов) большого размера. Поэтому был разработан алгоритм: на TScrollBox размещались TImage. Размер TImage(экран) чуть больше видимой области TScrollBox и кратный 256 пикселям(размер тайла). Затем экран заполнялся тайлами в соответствии с координатами. Таким образом, получалась большая карта и плавный скрол с инерцией

Отредактировал Alexander

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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


  • Похожий контент

    • От Botov Nikita
      Добрый день Уважаемые!
      Подскажите каким образом можно реализовать функцию ластика в XE 10.3?
      Например на форме лежит 2 TImage один над другим, и когда мышкой проводим по верхней картинке, остается "след" и видно нижнюю картинку?
      С Уважением!
    • От Павел Блажеев
      Добрый день. Очень нужна Ваша помощь. 
      Мне необходимо сделать координатную сетку в виде точек. При масштабировании панели количество точек должно изменяться . 
      Хочу все это сделать на канве панели. Унаследовал класс и переопределил procedure   Paint; override;
        Tfield = class(TPanel)
            Constructor Create( parent: TFmxObject);
              procedure   Paint; override;
              Procedure   OnMyClick (Sender: TObject);
          end;

      В теле метода я пробовал рисовать. Экспериментировал и столкнулся с такой проблемой. Ничего не отображается. Нет никаких изменений.
      Если я наследую не от Tpanel а от Timage то часть кода работает а часть работает очень криво. Очень хочу разобраться почему .
      {Отображается сразу}
      for a:=1 to 1000 do
            begin
              self.Canvas.Fill.Color:=  TAlphaColors.Crimson;
               self.Canvas.FillEllipse(rect(1,1,10,10),self.AbsoluteOpacity);
               self.Canvas.FillEllipse(rect(round(self.Width-9),round(self.Height-9),round(self.Width), round(self.Height)),self.AbsoluteOpacity);
               self.Canvas.FillEllipse(rect(round(self.Width-9),1,round(self.Width), 9),self.AbsoluteOpacity);
               self.Canvas.FillEllipse(rect(1,round(self.Height-9),10, round(self.Height)),self.AbsoluteOpacity);
            end;
       
      {Отображается только после того как я проскролю Scrollbox на котором лежит панель в крайнее нижнее правое положение}
            self.Canvas.Stroke.Color:=  TAlphaColors.Crimson;
            self.Canvas.Stroke.Thickness:=7;
             Canvas.BeginScene;
            self.Canvas.DrawLine(PointF(20, 20), PointF(100, 50), self.AbsoluteOpacity);
             Canvas.EndScene;
      Подскажите пожалуйста, почему не работает такое с панелью?  Как правильно рисовать на панели? 
      Почему в случае с имейджем все работает так некорректно?  Почему работает только после скрола? 
      Каким способом мне лучше сделать координатную сетку? состоящую из точек как в режиме Design?

       


    • От Евгений Корепов
      Для одного своего проекта сделал, поделюсь, вдруг кому пригодится. Тестировал под Windows и Android.
      Для использования просто добавьте BitmapAsyncLoader в uses, а дальше все просто:
      ImageControl.Bitmap.LoadFromURLAsync('https://bipbap.ru/wp-content/uploads/2017/10/0_8eb56_842bba74_XL-640x400.jpg'); Код юнита хелпера:
      unit BitmapAsyncLoader; interface uses FMX.Graphics, System.Net.HttpClient, System.Types, System.Classes; type TBitmapAsyncLoader = class helper for TBitmap procedure LoadFromUrlAsync(const AUrl : String); end; implementation var AHTTPClient : THTTPClient; procedure TBitmapAsyncLoader.LoadFromURLAsync(const AURL : String); begin try AHTTPClient.BeginGet( procedure (const ASyncResult: IAsyncResult) var AHTTPResponse : IHTTPResponse; begin if Not ASyncResult.IsCompleted then exit; try AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult); except end; if Assigned(AHTTPResponse) and (AHTTPResponse.StatusCode = 200) then TThread.Synchronize(Nil, procedure begin try Self.LoadFromStream(AHTTPResponse.ContentStream); except end; end ); end, AURL ); except end; end; initialization AHTTPClient:=THTTPClient.Create; finalization if Assigned(AHTTPClient) then begin AHTTPClient.DisposeOf; end; end. Архив с тестовым проектом прилагаю.
      BitmapAsyncLoader.7z
    • От Serg Sib
      RAD 10.2.3 Delphi , Win 10x64 Pro 1803
      Подскажите, с помощью чего можно осуществить трансформацию изображения по опорным точкам (по углам)?
      Возможно, что не напрямую сам TImage, а при помощи работы с Canvas на его Bitmap.
      Пока удалось добиться подобной трансформации, заполнив нужным изображением полигон и, меняя координаты его вершин, делать нужные корректировки.
      var MyBrushBitmap: TBrushBitmap; Image1.Bitmap.Canvas.Fill.Kind := TBrushKind.Bitmap; Image1.Bitmap.Canvas.Fill.Bitmap := MyBrushBitmap; Image1.Bitmap.Canvas.Fill.Bitmap.WrapMode := TWrapMode.TileStretch; Image1.Bitmap.Canvas.FillPolygon(MyPolygon, 50); Однако, изображение частично обрезается при этом.
      В интернете поиском находил пример подобной трансформации на VCL, (перетаскиванием вершин мышью), но не смог приспособить этот пример для платформы FireMonkey.
    • От PavelS
      Здравствуйте! Начал изучать FireMonkey  и столкнулся с тем, что TBitmap не поддерживает размер изображения больше 8132, кажется. Т.е. большие размеры рисунка он грузит, но за счёт потери качества, размер пиксела растёт, а размер рисунка по оси всё равно не превышает 8132. В то же время в простом дельфи можно грузить и работать с гораздо большими размерами, например, один из файлов имеет размер 61216 х 1486 точек. Подскажите пожалуйста, есть ли возможность работать с большими файлами в FireMоnkey и как это можно организовать? Программа создаётся для работы только в Windows.
    • От Tot999
      Добрый день! 
      Решил покопаться в своей старой спрайтовой игрушке, чтобы освежить в памяти знания и состряпать что-нибудь новое. Возникли сомнения, нормально ли сделано графическое отображение, можно ли доработать.
      Все спрайты в дизайнтайме распиханы по Timagelist-ам.  На старте приложения я загружаю битмапы из имэджлистов в свои обджектлисты, подгоняя под нужный размер. 
      MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList<Tbitmap>;  
      Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:
               
      В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.
    • От x11
      Можно ли получить TBitmap из TBitmapImage? Конвертировать.
    • От Tumaso
      Столкнулся со следующей проблемой - TImage игнорирует установленные значения XRadius и YRadius у TRectangle (10.1 Berlin with update 2)
       
      Суть - мне необходимо, чтобы у TRectangle углы были немного скругленные, для этого я устанавливаю XRadius и YRadius. Внутри TRectangle расположен TImage (левый верхний угол 0,0, ширина и высота совпадают с размерами TRectangle). Когда я загружаю картинку в TImage (что в дизайнере, что программно), получается что TImage отображается с прямыми углами, игнорируя XRadius и YRadius своего родителя. Свойство ClipChildren у TRectangle установлен.
      Как сделать так, чтобы TImage скруглялся по углам? Что интересно, TCircle в этом плане работает, обрезая TImage.
    • От Freezer_86
      Пишу кроссплатформенное приложение. Результат поиска отображается в TGrid. Стал вопрос отображения картинки в одной из колонок.
      На Windows все ок, но на планшете происходят просто чудеса: при первом отображение все корректно, но если простоколить вверх-вниз как картинки одни перетираются другими, часть вообще отображается вверх ногами.
      Код для сохранение картинки(jpg) в базу:
      if Assigned(sm) then begin sm.Position := 0; //TBlobField(dmData.cdsPlayerData.FieldByName('Photo')).LoadFromStream(sm); vImage := TImage.Create(nil); try sm.Position := 0; vImage.Bitmap.LoadFromStream(sm); vKoef := vImage.Bitmap.Height / 64; vImage.Bitmap.Resize(Trunc(vImage.Bitmap.Width / vKoef), Trunc(vImage.Bitmap.Height / vKoef)); sm.Free; sm := TMemoryStream.Create(); try vImage.Bitmap.SaveToStream(sm); TBlobField(dmData.cdsPlayerData.FieldByName('SmallPhoto')).LoadFromStream(sm); finally sm.Free; end; finally vImage.Free; end; end{if}; До скрола:

      После скрола:

      Пробовал и LiveBinding, и ручную прорисовку - результат один и тот же. Есть идеи что не так?
      P.S. Знаю что нужно делать через TListView, но заказчик хочет «сеточку как в старой программе», так как на android будет работать только на планшетах – я согласился.
       
    • От yooSee
      Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 
      Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.
      Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)
      Раньше код ниже работал сейчас нет не пойму что не так. Почему стал ковырять? потому что форма встает колом при загрузке изображений.
       
      var s: string; fs: TFileStream; begin fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'), fmCreate); NetHTTPClient1.Get((Sender as TImage).Hint, fs); fs.Free; (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg')); подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl ((Sender as TImage).Hint); как проще сделать посоветуете чтоб и грузилось и форма не висла?
  • Последние посетители   0 пользователей онлайн

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

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