Склеивание большого кол-ва тайлов

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модераторы: Tolik, zed

Re: Склеивание большого кол-ва тайлов

Сообщение feya » 22 дек 2008, 12:47

и даже при замене
Код: Выделить всё
BMPRead(Sender,nNextLine,InputArray);
на
Код: Выделить всё
     for i:=0 to w-1 do
      begin
       InputArray^[i].b:=255;
       InputArray^[i].g:=0;
       InputArray^[i].r:=0;
      end;

Чтоб совсем исключить возможные ошибки в BMPRead Получаем нечто странное.
Что я делаю не так?
http://SASGIS.ru | SAS.Планета | SASPlanet
Аватара пользователя
feya
Администратор
 
Сообщения: 2035
Зарегистрирован: 13 июл 2008, 10:45
Благодарил (а): 5 раз.
Поблагодарили: 30 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение svp » 22 дек 2008, 14:41

feya писал(а):Вопрос: Что за хня?

Ага. Понятно. Строки в БМП файле должны быть выровнены по 4 байта. То есть, если ширина картинки 514 пикселей, то строки на самом деле должны содержать 514 * 3 + (4 - (514*3 mod 4)) байт для (24-х битного цвета). Потому картинки с шириной 512, 516, 520 сохраняются нормально, а всё, что не делится нацело на 4 идёт с перекосом.
Чтобы не осталось непонтятностей с формулами, вот я поправил процедуру:
Код: Выделить всё
procedure SaveBMP(Sender:TObject; W, H : integer; tPath : string; readcallback:TBMPRead);  // Çàïèñü íà äèñê ôàéëà
Var f : file;
    i ,nNextLine: integer;
    InputArray:PlineRGBb;
    TypeBmp:Word;
    Header: bmHeader;
begin
   Header:=SaveBMPHeader(tPath,W,H);
   AssignFile(f,tPath);
   ReWrite(f,1);
   TypeBmp  := $4D42;

   BlockWrite(f,TypeBmp,sizeof(TypeBmp));
   BlockWrite(f,Header,sizeof(Header));

   BMPRead:=readcallback;

   getmem(InputArray,(W )*3+1                 + (4 - (w*3 mod 4))      );

   for nNextLine:=0 to h-1 do
    begin
//     if not(ThreadScleit(Sender).Fprogress.Visible) then break;
//     BMPRead(Sender,nNextLine,InputArray);
     for i:=0 to w-1 do
      begin
       InputArray^[i].b:=i mod 255;
       InputArray^[i].g:=i mod 255;
       InputArray^[i].r:=nNextLine mod 255;
      end;

     seek(f, (h - nNextLine - 1) * ((W) * 3    + (4 - (w*3 mod 4))      ) +54);
     BlockWrite(f,InputArray^,((W)*3            + (4 - (w*3 mod 4))     ));
    end;

   FreeMem(InputArray);
   CloseFile(F);
end;

Соответственно при подсчёте размера битмапа надо учитывать эти добавки:
Код: Выделить всё
   Result.i.SizI:=(W * 3    + (4 - (w*3 mod 4))     )*H;// размер витмапа

P.S.
А ещё, если мне не изменяет память, там в шапке где-то должна указываться не только ширина картинки, но и какая получается реальная длина строк в байтах с учётом выравнивания по 4 байта. Насчёт этого я точно не помню. Давно очень игрался с этими форматами на ассемблере, теперь уж позабыл все тонкости=).
Аватара пользователя
svp
Советчик
 
Сообщения: 446
ICQ: 204094886
Зарегистрирован: 26 авг 2008, 11:14
Откуда: Белгород
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение feya » 22 дек 2008, 17:25

svp
Большое спасибо!
http://SASGIS.ru | SAS.Планета | SASPlanet
Аватара пользователя
feya
Администратор
 
Сообщения: 2035
Зарегистрирован: 13 июл 2008, 10:45
Благодарил (а): 5 раз.
Поблагодарили: 30 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Vinil_37 » 26 янв 2009, 19:32

Большое спасибо за утилитку!
При попытке склейки Харькова с "Карта Украины (mapia.com.ua)", не находит скачаных файлов, хотя они есть. Может быть это потому что они в *.png формате?
"Больше быть чем казаться, много делать и мало выделяться."
Аватара пользователя
Vinil_37
Постигающий Дао
 
Сообщения: 127
ICQ: 172097021
Зарегистрирован: 24 сен 2008, 12:24
Откуда: Харьков
Благодарил (а): 5 раз.
Поблагодарили: 2 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение svp » 26 янв 2009, 20:08

Vinil_37 писал(а):находит скачаных файлов, хотя они есть. Может быть это потому что они в *.png формате?

Скорее всего именно поэтому. За подробностями, конечно, к Cowa, но думается мне его утилитка не умеет принимать во внимание png-файлы. Особенно если у них ещё и расширение будет jpg.
Аватара пользователя
svp
Советчик
 
Сообщения: 446
ICQ: 204094886
Зарегистрирован: 26 авг 2008, 11:14
Откуда: Белгород
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Cowa » 26 янв 2009, 22:46

Vinil_37 писал(а):Большое спасибо за утилитку!
При попытке склейки Харькова с "Карта Украины (mapia.com.ua)", не находит скачаных файлов, хотя они есть. Может быть это потому что они в *.png формате?

Да не за что :)
А утилите все равно в каком формате тайлы - jpg или png. Если в исходной папке jpg-файл, то берется в обработку он, если png - то он. В любом случае он сначала приводится к битмапу.
В вашем случае, мне кажется просто не правильно определены координаты, либо не правильно указана карта. Если после внимательного ввода координат, карты и уровня детализации, где ТОЧНО есть соответствующие тайлы, проблема останется, то все эти параметры в студию (и версию SAS тоже) - будем разбираться.
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение SOVOS » 03 фев 2009, 18:52

Скачал сегодня. Утилита оч нужна но не работает. Выбираю папку кеша а он мне кричит не правильная папка (нет файлв мап.ини). Пробовал все другие папки подставлять (даже "МАП" где есть файл мап ини - результат одинаков.
SOVOS
Новичок
 
Сообщения: 2
Зарегистрирован: 03 фев 2009, 18:27
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Склеивание большого кол-ва тайлов

Сообщение Cowa » 04 фев 2009, 01:41

SOVOS
Эта утилита работает со старым типом maps.ini. Для нового типа я ее не делал, т.к. функцию склейки в BMP feya уже реализовал в SAS.Планете.
Cowa
Постигающий Дао
 
Сообщения: 173
Зарегистрирован: 23 авг 2008, 01:46
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Пред.

Вернуться в SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

cron