SASGIS - SAS.Планета
View Issue Details
0001627SAS.Планета[All Projects] Багpublic12-10-2012 05:1705-05-2014 06:54
olegpv 
zed 
normalmajoralways
resolvedfixed 
120808 
140505140505 
0001627: Добавить режим получения типа тайла по содержимому игнорируя информацию от сервера
Не открываются тайлы PNG, если Content-Type image/jpeg
В ТопоКарте (Маршруты.ру) часть тайлов не загружается.
Для них пишет error [53] non a jpeg file.
No tags attached.
has duplicate 0002383closed vdemidov Ошибка отображения нормально загруженного тайла 
? GTIMAGE.PAS (22,673) 05-04-2014 18:31
https://bugtracker.sasgis.org/file_download.php?file_id=1724&type=bug
Issue History
12-10-2012 05:17olegpvNew Issue
12-10-2012 05:17olegpvFile Added: mar.png
14-10-2012 17:24GarlNote Added: 0009537
14-10-2012 17:27GarlNote Added: 0009538
14-10-2012 17:35GarlFile Added: png_jpg.jpg
14-10-2012 19:43zedNote Added: 0009540
15-10-2012 16:45GarlNote Added: 0009552
15-10-2012 17:28olegpvNote Added: 0009553
16-10-2012 04:41zedNote Added: 0009556
16-10-2012 04:44GarlNote Added: 0009558
16-10-2012 05:00zedNote Added: 0009559
16-10-2012 05:01GarlNote Added: 0009560
16-10-2012 05:01GarlNote Edited: 0009560bug_revision_view_page.php?bugnote_id=9560#r4641
16-10-2012 05:14zedNote Added: 0009563
16-10-2012 07:04vdemidovNote Added: 0009564
16-10-2012 09:31GarlNote Added: 0009570
18-10-2012 17:37zedNote Added: 0009598
19-10-2012 06:24olegpvNote Added: 0009600
23-10-2012 05:00TolikNote Added: 0009699
23-10-2012 05:00TolikStatusnew => acknowledged
23-10-2012 05:01TolikNote Edited: 0009699bug_revision_view_page.php?bugnote_id=9699#r4705
23-10-2012 05:03TolikSummaryв топокарте маршруты ру часть тайлов не загружается => Не открываются тайлы PNG, если Content-Type image/jpeg
23-10-2012 05:03TolikDescription Updatedbug_revision_view_page.php?rev_id=4707#r4707
23-10-2012 05:08TolikNote Edited: 0009699bug_revision_view_page.php?bugnote_id=9699#r4708
23-10-2012 09:55TolikNote Added: 0009711
23-10-2012 09:57TolikNote Edited: 0009699bug_revision_view_page.php?bugnote_id=9699#r4720
23-10-2012 10:08TolikNote Edited: 0009699bug_revision_view_page.php?bugnote_id=9699#r4721
23-10-2012 10:11TolikNote Edited: 0009711bug_revision_view_page.php?bugnote_id=9711#r4723
23-10-2012 10:11TolikNote Edited: 0009711bug_revision_view_page.php?bugnote_id=9711#r4724
23-10-2012 10:25TolikNote Edited: 0009699bug_revision_view_page.php?bugnote_id=9699#r4725
19-05-2013 12:02zedProjectДоработка карты (ZMP) => SAS.Планета
28-05-2013 12:41vdemidovStatusacknowledged => confirmed
28-05-2013 12:41vdemidovProduct Version => 120808
28-05-2013 12:41vdemidovTarget Version => 50xxxx
28-05-2013 12:41vdemidovSummaryНе открываются тайлы PNG, если Content-Type image/jpeg => Добавить режим получения типа тайла по содержимому игнорируя информацию от сервера
28-05-2013 12:41vdemidovDescription Updatedbug_revision_view_page.php?rev_id=5384#r5384
19-03-2014 12:59vdemidovRelationship addedhas duplicate 0002383
05-04-2014 06:31olegpvNote Added: 0014110
05-04-2014 06:37vdemidovNote Added: 0014111
05-04-2014 06:53olegpvNote Added: 0014112
05-04-2014 15:39vdemidovNote Added: 0014113
05-04-2014 18:30GarlNote Added: 0014114
05-04-2014 18:31GarlFile Added: GTIMAGE.PAS
05-04-2014 18:45olegpvNote Added: 0014115
06-04-2014 04:48zedNote Added: 0014116
06-04-2014 04:49zedNote Edited: 0014116bug_revision_view_page.php?bugnote_id=14116#r6011
07-04-2014 12:54zedNote Added: 0014118
07-04-2014 13:06zedStatusconfirmed => resolved
07-04-2014 13:06zedFixed in Version => 141111
07-04-2014 13:06zedResolutionopen => fixed
07-04-2014 13:06zedAssigned To => zed
07-04-2014 13:07zedTarget Version50xxxx => 141111
07-04-2014 13:07zedFile Deleted: mar.png
07-04-2014 13:07zedFile Deleted: png_jpg.jpg
07-04-2014 13:26vdemidovNote Added: 0014119
07-04-2014 13:45zedNote Added: 0014120
07-04-2014 14:08vdemidovNote Added: 0014121
14-04-2014 11:39TolikNote Added: 0014140
14-04-2014 11:41TolikNote Edited: 0014140bug_revision_view_page.php?bugnote_id=14140#r6015
14-04-2014 11:42TolikNote Edited: 0014140bug_revision_view_page.php?bugnote_id=14140#r6016
14-04-2014 11:43zedNote Added: 0014141
14-04-2014 11:47zedNote Added: 0014143
14-04-2014 11:48TolikNote Added: 0014144
14-04-2014 11:50zedNote Added: 0014145
14-04-2014 11:54TolikNote Edited: 0014144bug_revision_view_page.php?bugnote_id=14144#r6018
05-05-2014 06:54vdemidovTarget Version141111 => 140505
05-05-2014 06:54vdemidovFixed in Version141111 => 140505

Notes
(0009537)
Garl   
14-10-2012 17:24   
в этих случаях ресурс возвращает png под видом image\jpeg
(0009538)
Garl   
14-10-2012 17:27   
как вариант конечно можно прикрутить, но Планета не поддерживает 32 битные PNG
(0009540)
zed   
14-10-2012 19:43   
>но Планета не поддерживает 32 битные PNG
Как это не поддерживает. Должны читаться.
(0009552)
Garl   
15-10-2012 16:45   
читаются, но отображаются не корректно (см вложение png_jpg.jpg)
вот но тайл http://maps.marshruty.ru/ml.ashx?al=1&i=1&x=1244&y=734&z=11
по всем признакам там jpeg, но содержимое там PNG32 bit
(0009553)
olegpv   
15-10-2012 17:28   
жалко. самые лучшие топокарты оттуда. главное на разных уровнях разный масштаб. а может можно по содержанию определять формат как в браузерах.
(0009556)
zed   
16-10-2012 04:41   
>по всем признакам там jpeg, но содержимое там PNG32 bit
Ну так и решать нужно эту проблему, либо искать как её обойти. Оно и ежу понятно, что если на вход jpeg-декомпрессору подсунуть png файл, будет ошибка (о чём и сообщается в тикете). Каждый тип растра нужно обрабатывать именно тем декомпрессором, который под это заточен.

>в этих случаях ресурс возвращает png под видом image\jpeg
т.е. там в заголовках возвращается неверный content-type?
(0009558)
Garl   
16-10-2012 04:44   
>>в этих случаях ресурс возвращает png под видом image\jpeg
> т.е. там в заголовках возвращается неверный content-type?
именно
(0009559)
zed   
16-10-2012 05:00   
1. Кривой ресурс, и при возможности желательно сообщить об этом лаге их админу
2. В САСе, сразу после загрузки тайла, можно сделать проверку content-type по содержимому (в WinApi по-моему даже есть какая-то функция для этого). Соответственно, и в zmp нужно будет добавить тип image/png, чтобы вызывался правильный декомпрессор.
(0009560)
Garl   
16-10-2012 05:01   
ИМХО это сделато именно с целью борьбы с САС-Планетой :)

(0009563)
zed   
16-10-2012 05:14   
"На каждую хитрую гайку, всегда найдётся болт с левой резьбой" (c)
(0009564)
vdemidov   
16-10-2012 07:04   
Для таких хитрых болтов, в САС.Планете уже годы как есть режим игнорирования отдаваемых сервером content-type
(0009570)
Garl   
16-10-2012 09:31   
тут фишка в чём, в 99.9% отдаётся jpeg, а в 0.01% PNG32 под видом jpeg
и при defaultContentType=image/jpeg - пропускает ПНГ, иначе не ловит Джипеги
(0009598)
zed   
18-10-2012 17:37   
Т.е. в параметрах карты нужно либо прописать:
ContentType=image/jpeg, image/png

либо включить игнорирование контента:
IgnoreContentType=1

В обоих случаях, в кэш тайлы сохранятся в jpeg формате (те что прилетят в png будут автоматически сконвертированы в jpeg принудительно).
(0009600)
olegpv   
19-10-2012 06:24   
не так не, так не работает
ContentType=image/jpeg, image/png там так и есть
(0009699)
Tolik   
23-10-2012 05:00   
(edited on: 23-10-2012 10:25)
Проблема в том, что SAS не пытается открыть этот PNG файл с расширением jpg, выдаёт ошибку
"This is not JPEG file, starts with 0x89 0x50".
Надо исправить в коде, чтобы вместо этой ошибки запускался декодер PNG (ибо 0x89 0x50 - это и есть начало %PNG).

Пример неправильного контент тайпа здесь: 56°01'24.77" 37°00'00.43", зум 12, а также крестом во все стороны от этого тайла.
Сам тайл открывается сасом без проблем.


Просьба к Администратору перенести этот тикет в проект SAS.

(0009711)
Tolik   
23-10-2012 09:55   
(edited on: 23-10-2012 10:11)
Если в params.txt сделать

IgnoreContentType=1
DefaultContentType=image/png

то скачиваются именно плохие тайлы и сохраняются в формате jpg (что позволяет докачать дыры. Хорошие jpg при этом почему-то не скачиваются.)

Но если вернуть IgnoreContentType=0, то они затираются файлами в формате png (с расширением jpg), которые не отображаются на карте.

(0014110)
olegpv   
05-04-2014 06:31   
сделал такой скрипт на пхп.
он преобразовывает файлы png в jpg а jpg не изменяет
можно его либо на локальном сервере выкладывать либо на хостинге и в настройках карты его url писать

<?php

$x=$_GET['x'];
$y=$_GET['y'];
$z=$_GET['z'];


$url='http://maps.marshruty.ru/ml.ashx?al=1&i=1&x='.$x.'&y='.$y.'&z='.$z.'&i=1&ss=7f0924';
// создание нового cURL ресурса
$ch = curl_init();
// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
$data = curl_exec($ch);
curl_close($ch);

$info = getimagesizefromstring ($data);
if ($info !== false) {
    $width = $info[0];
    $height = $info[1];
    //if ($this->w < $minWidth || $this->h < $minHeight) return false;
    $image_type = $info[2];
    header('Content-Type: image/jpeg');
    if($image_type==IMAGETYPE_JPEG){
        echo $data;
    }else{
        $img=imagecreatefromstring($data);
        //$c = imagecolorallocate($img, 255, 255, 255);
        //$c = imagecolorallocate($img, 0,0,0);

        // Make the background transparent
        //imagecolortransparent($img, $c);
        $output = imagecreatetruecolor($width, $height);
        $white = imagecolorallocate($output, 255, 255, 255);
        imagefilledrectangle($output, 0, 0, $width, $height, $white);
        imagecopy($output, $img, 0, 0, 0, 0, $width, $height);
        imagejpeg($output,null,100);
    }

}
(0014111)
vdemidov   
05-04-2014 06:37   
На самом деле самому перекодировать совсем не обязательно, достаточно отправить правильный нидер и САС сам все перекодирует. Проблема в том, что некоторые сервера нагло врут.
(0014112)
olegpv   
05-04-2014 06:53   
но ведь можно определять тип не по content type а по самому содержимому картинки. наверняка и для дельфи есть какая нибудь библиотека. и в пхп и в джаве можно просто открыть картинку и они сами определяют тип. MOBAC с маршрутов скачивает эти картинки нормально и все показывается.
(0014113)
vdemidov   
05-04-2014 15:39   
Конечно можно, и даже нужно. В этом и состоит суть этой хотелки. Просто нужно найти или написать библиотеку для определения типа по содержимому и решить куда это вставить.
(0014114)
Garl   
05-04-2014 18:30   
вспомнил где видел определялку ) в NDN была одно время как плагин.

немного гугля, и вот оно:

http://philip.helger.com/gt/download.php#gtw
(0014115)
olegpv   
05-04-2014 18:45   
вот еще простая
http://delphihaven.wordpress.com/2011/01/22/tip-detecting-graphic-formats/
можно вставить там где определяется по content type.
браузер тоже по содержимому определяет и показывает их.
(0014116)
zed   
06-04-2014 04:48   
(edited on: 06-04-2014 04:49)
FindMimeFromData:
contains hard-coded tests for (currently 26) separate MIME types (see Known MIME Types). This means that if a given buffer contains data in the format of one of these MIME types, a test exists in FindMimeFromData that is designed (by scanning through the buffer contents) to recognize the corresponding MIME type.

Функция живёт в urlmon.pas.

(0014118)
zed   
07-04-2014 12:54   
Сделал. В zmp появился новый параметр: DetectContentType=1, при включении которого, после загрузки тайла будет выполнятся анализ его содержимого и коррекция поля Content-Type (при необходимости и при условии, что таки удалось определить тип). Для определения типа используется функция FindMimeFromData и поддерживается ограниченное число форматов, но jpeg/gif/png/bmp там есть, так что её возможностей для нас должно быть достаточно.
(0014119)
vdemidov   
07-04-2014 13:26   
Для случая тайлохранилища на БерклиДб, СУБД и тп. можно было не конвертировать тайл, а сохранять как есть, если он того же класса так сказать. Тоесть, если ждем битмапку, а пришла kml это, конечно, ошибка. А если пришла любая битмпака, то можно сохранять и так.
(0014120)
zed   
07-04-2014 13:45   
Это вообще отдельный разговор. Тут мы просто исправляем хидеры ответа сервера, чтобы они соответствовали содержимому и всё было без обмана.
(0014121)
vdemidov   
07-04-2014 14:08   
Да знаю. Просто к слову пришлось. Это нужно отельную хотелку заводить.
(0014140)
Tolik   
14-04-2014 11:39   
(edited on: 14-04-2014 11:42)
Что-то не работает.
Говорит, unexpected content type image/x-png или image/pjpeg

140407.8030

А что, ночнушка не скомпилировалась до сих пор?


plus.maps\_Genshtab\topo_marshruty.zmp\

[PARAMS]
pnum=199
GUID={025de135-53fd-45db-b90e-fafbb7fb3bf4}
name=рНОНйЮПРЮ (лЮПЬПСРШ.ПС)
name_en=TopoMap (marshruty.ru)
name_uk=TopoMap (marshruty.ru)
NameInCache=topo_marshruty
DefURLBase=http://maps.marshruty.ru/ml.ashx?al=1&i=1&x=
DetectContentType=1
ParentSubMenu=цЕМЬРЮА
ParentSubMenu_en=Genshtab
ParentSubMenu_uk=Genshtab
Ext=.jpg
projection=1
sradiusa=6378137
sradiusb=6378137
UseDwn=1
RequestHead=Referer: http://maps.marshruty.ru/

(0014141)
zed   
14-04-2014 11:43   
В приведенной цитате ContentType не прописан же.

ContentType=image/png,image/x-png,image/jpeg,image/pjpeg

Странно, что ругается на x-png и pjpeg, какая версия IE и что за винда?
(0014143)
zed   
14-04-2014 11:47   
> 140407.8030
> А что, ночнушка не скомпилировалась до сих пор?

В этой версии уже всё должно работать. Изменения были в 8029 коммите.
(0014144)
Tolik   
14-04-2014 11:48   
(edited on: 14-04-2014 11:54)
А, я думал, что ContentType можно не писать, чтобы брал любой.
Теперь работает, только старые серые квадраты надо стирать вручную.
Винда 7 SP1, а IE 8.

P.S. Закинул zmp в репо.

(0014145)
zed   
14-04-2014 11:50   
Не, ContentType писать нужно всегда.