SASGIS - SAS.Планета
View Issue Details
0000368SAS.Планета[All Projects] Хотелкаpublic11-01-2011 04:0510-10-2012 11:49
Parasite 
zed 
nonetweakalways
closedfixed 
WindowsXPSP3
101206 
120808120808 
0000368: Сведение в PNG с альфой
Хотелось бы возможности сведения карт, использующих PNG-тайлы с альфа-каналом - в этот же самый PNG (с сохранением альфы). Спасибо.
gif, png, альфа-канал, прозрачность, склейка, экспорт
related to 0000041closed zed Хочется иметь возможность склеивать в формат PNG 
Issue History
11-01-2011 04:05ParasiteNew Issue
12-01-2011 18:13vdemidovStatusnew => acknowledged
12-01-2011 18:13vdemidovProduct Version => 101206
12-01-2011 18:13vdemidovTarget Version => 29xxxx
10-03-2011 09:41vdemidovRelationship addedduplicate of 0000041
10-03-2011 09:41vdemidovTarget Version29xxxx => 40xxxx
10-03-2011 10:56ParasiteNote Added: 0001146
10-03-2011 19:21gpsMaxTag Attached: png
10-03-2011 19:21gpsMaxTag Attached: склейка
10-03-2011 19:21gpsMaxTag Attached: экспорт
10-03-2011 19:22gpsMaxNote Added: 0001159
11-03-2011 03:54ParasiteNote Added: 0001165
11-03-2011 03:55ParasiteNote Added: 0001166
11-03-2011 03:56ParasiteSummaryСведение в PNG (с альфой) => Сведение в GIF\PNG с альфой
11-03-2011 03:56ParasiteDescription Updatedbug_revision_view_page.php?rev_id=340#r340
11-03-2011 03:57ParasiteRelationship replacedrelated to 0000041
11-03-2011 03:57ParasiteTag Attached: gif
11-04-2011 07:11vdemidovStatusacknowledged => confirmed
11-04-2011 08:34gpsMaxTag Attached: прозрачность
11-04-2011 08:35gpsMaxTag Attached: альфа-канал
12-04-2011 08:27ParasiteNote Added: 0001807
12-04-2011 08:51vdemidovNote Added: 0001810
12-04-2011 09:33ParasiteNote Added: 0001813
12-04-2011 09:39ParasiteNote Added: 0001814
12-04-2011 10:00TolikNote Added: 0001815
12-04-2011 10:02vdemidovNote Added: 0001816
12-04-2011 10:02vdemidovNote Edited: 0001816bug_revision_view_page.php?bugnote_id=1816#r765
12-04-2011 14:56ParasiteNote Added: 0001824
13-04-2011 09:34TolikNote Added: 0001844
13-04-2011 10:27ParasiteNote Added: 0001845
06-06-2011 21:52gpsMaxPrioritynormal => none
22-12-2011 20:54zedStatusconfirmed => resolved
22-12-2011 20:54zedFixed in Version => 24xxxx
22-12-2011 20:54zedResolutionopen => fixed
22-12-2011 20:54zedAssigned To => zed
22-12-2011 20:55zedTarget Version40xxxx => 24xxxx
23-12-2011 15:07vdemidovNote Added: 0004615
23-12-2011 15:08zedSummaryСведение в GIF\PNG с альфой => Сведение в PNG с альфой
23-12-2011 15:08zedNote Added: 0004616
23-01-2012 08:26vdemidovFixed in Version24xxxx => 120808
23-01-2012 08:26vdemidovTarget Version24xxxx => 120808
23-01-2012 08:26vdemidovDescription Updatedbug_revision_view_page.php?rev_id=2596#r2596
23-01-2012 09:18ParasiteNote Added: 0005185
23-01-2012 09:19ParasiteNote Edited: 0005185bug_revision_view_page.php?bugnote_id=5185#r2598
23-01-2012 09:20zedNote Added: 0005186
23-01-2012 09:35zedNote Edited: 0005186bug_revision_view_page.php?bugnote_id=5186#r2600
23-01-2012 09:58ParasiteNote Added: 0005188
23-01-2012 10:04TolikNote Added: 0005191
23-01-2012 10:04zedNote Added: 0005192
23-01-2012 10:37ParasiteNote Added: 0005198
23-01-2012 10:58zedNote Added: 0005199
23-01-2012 12:10ParasiteNote Added: 0005202
23-01-2012 14:30zedNote Added: 0005204
10-10-2012 11:49TolikStatusresolved => closed

Notes
(0001146)
Parasite   
10-03-2011 10:56   
Он не дублирует, а дополняет.
В 0000041 упор на сам факт сведения в PNG.
В 0000368 - на сведение именно с прозрачностью, а не просто сохранение в данный формат файла как таковой.
(0001159)
gpsMax   
10-03-2011 19:22   
Альфой предполагается заливать те места, где нет тайлов? Или что с ней делать?
(0001165)
Parasite   
11-03-2011 03:54   
Альфу предлагается просто оставлять на своем месте там, где она существует на исходных тайлах. Это касается GIF и PNG. Например, тот же гибрид гугля - гиф с прозрачностью (на сервере), при попытке его сведения текущим САСом - получаем белый фон вместо альфы. То же самое и с PNG. То есть, исходно существующий альфа-канал безвозвратно теряется и способов его восстановить из сведенного изображения - нет (кроме как опять обработать в фотошопе и ручками снова добавить прозрачность, то есть - пересоздать всю альфу ручками). Безусловная потеря САСом части информации с изображения не есть гуд, отсюда и хотелка.

И да, как фичу - можно делать "альфа-дырки" на месте отсутствующих тайлов. Было бы приятно в фотошопе просто подложить бакграунд нужного цвета под всю карту, а не иметь сикес выделяя каждый пустой квадратик ручками и заливая краской...ведь оных на карте могут быть десятки, тысячи и даже миллионы...
(0001166)
Parasite   
11-03-2011 03:55   
Так как фича касается и GIF(с альфой) в той же мере что и PNG - подредактировал название хотелки.
(0001807)
Parasite   
12-04-2011 08:27   
Кстати, при проработке вопроса лучше всего было бы иметь ползунок "альфовости" этой альфы, то есть менять меру прозрачности (согласно обсужденного тут: http://sasgis.org/forum/viewtopic.php?f=2&t=1&p=19807#p19801)
(0001810)
vdemidov   
12-04-2011 08:51   
Ну и по какой формуле? Допустим на ползунке выбрано 63 из 255, то есть сильно прозрачное. А пиксел имеет прозрачность 195, тоесть почти не прозрачно. Что выводить в результат?
(0001813)
Parasite   
12-04-2011 09:33   
>Ну и по какой формуле? Что выводить в результат?
Из твоих цифирок выше:
a=195 (пиксел)
n=63 (ползунок)
R=(a/100)*n, т.е. в результат выводить 123 (63% от значения 195). То есть - пиксел будет почти точно полупрозрачный, тогда как при исходных a=195 он был "сильно прозрачным" в исходнике.

Ползунок на максимум (100%) даст нам родную картину альфы как она пришла с сервера. Такое положение предлагаю сделать дефолтным.
Ползунок же на 0% - даст нам ноль альфы, т.е.полностью непрозрачные пиксели станут даже там, где они были прозрачными изначально (но RGB у них никто не отменял). То есть, слой визуально станет картой - без шаманства с ZMP. :)

Расчет результирующего цвета идет по каноничным: http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D1%8C%D1%84%D0%B0-%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB , у нас лишь введется дополнительная "мера альфовости самой альфы" в процентах от user-defined ползунка.
(0001814)
Parasite   
12-04-2011 09:39   
PS:

>пиксел имеет прозрачность 195, тоесть почти не прозрачно
Альфа - это обратная величина, и a=255 соответствует полной прозрачности, а a=0 - нативному цвету, декларируемому как "бакграунд" в хидере, что вкупе с разрешенной альфой дает прозрачность "баграунд-цвета".
Соответственно, пиксел с a=195 -> это "сильно прозрачный" пиксел.
(0001815)
Tolik   
12-04-2011 10:00   
По этой формуле получается только "затемнение" (полу)прозрачных пикселей. Нужно также "осветление" непрозрачных.
Т.е. чтобы альфу 0 можно было превратить (в пределе) в 255.
(0001816)
vdemidov   
12-04-2011 10:02   
Ну в САС везде используется альфа в виде однобайтового числа без знака. Так что 0 это полностью прозрачный, а 255 полностью непрозрачный.
и 195 это таки очень непрозрачный.

(0001824)
Parasite   
12-04-2011 14:56   
>Т.е. чтобы альфу 0 можно было превратить (в пределе) в 255
Каким образом, если начальных данных об альфе по данному пикселу НЕТ? Того самого значения 'a' из примера выше. Будем всегда умножать ползунок, каким бы большим он ни был - на ноль? Результат немного предсказуем. :)

Это раз. А два - что будем делать с клиппингами? Любое положительное значение альфы, помноженное на растущий положительный ползунок, рано или поздно упрется в предел 1 байта (=255). А так как вся картинка у нас не однородная, а содержит какие-то плавные переходы по альфе - то практически сразу получаем ситуацию, когда более альфовые пиксели уже уперлись в 255, а более соседние можно бы и еще подвигать...То есть, придется либо "пересвечивать" (обрезать по 255) бОльшие пиксели и плевать на них с потерей их реальных значений, либо забыть про ползунок как только хоть один пиксель упрется в 255 чтобы не искажать всю картину (а там такие пиксели могут быть изначально с сервера, например полностью прозрачный участок).

>и 195 это таки очень непрозрачный.
Windows/Delphi feature? :(
------------
$tiletemp=Image::Magick->new(size=>255x255, magick=>'png', colorspace=>'RGBA');
    $tiletemp->Read("xc:red");
    $tiletemp->Set(alpha => 'transparent:255');
    $tiletemp->Set('transparent-color' => 'red');
    $tiletemp->Mogrify('transparent-color' => 'red');
$tiletemp->Write('test.png');
------------
На выхлопе - "стеклянный" (прозрачный) тайл (#FF0000FF в к.пикселе).
При "transparent:0" - красный непрозрачный тайл (#FF000000)

PS: а мы значение альфы со значением a-маски не путаем? ;) В a-маске как раз обратное положение дел, #00 в маске = прозрачность в изображении (и соответственно #FF альфы, сохраняемый в файл).

В любом случае, это некритично. Если в винде наоборот - ну и иметь это ввиду при расчетах, да и все. Имхо.
(0001844)
Tolik   
13-04-2011 09:34   
Умножать на ноль я как бы не предлагал.
Если движок работает только на упрозрачнивание (0 - без изменений, 255 - полная прозрачность), то формула будет:
R = a + n*(255 - a)/255
Это если линейно, а можно и что-то вроде гамма-коррекции замутить.
(0001845)
Parasite   
13-04-2011 10:27   
>Умножать на ноль я как бы не предлагал.
Однако вышеописанная ситуация - не исключена, не так ли?
А клиппинги будут всегда, как только мы попробуем увеличивать уже оптимизированные (изначально лежащие на промежутке 0...255 при максимуме в 255) значения.

>можно и что-то вроде гамма-коррекции замутить.
Угу. Осталось найти того, кто это "что-то" будет мутить. :)
(0004615)
vdemidov   
23-12-2011 15:07   
А разве есть экспорт в GIF? Если нету, то нужно переименовать хотелку.
(0004616)
zed   
23-12-2011 15:08   
Изменил.
(0005185)
Parasite   
23-01-2012 09:18   
(edited on: 23-01-2012 09:19)
>А разве есть экспорт в GIF? Если нету, то нужно переименовать хотелку.
Смысл хотелки и заключался в том, чтобы этот экспорт _сделать_. С прозрачностью. из числа тех ГИФ-тайлов (ГИФ, внимание), которые приходят в программу.

>Изменил.
Ай малацца! А теперь меняй обратно, ибо 50% описания хотелки - это еще не вся описанная хотелка. :)

(0005186)
zed   
23-01-2012 09:20   
(edited on: 23-01-2012 09:35)
А нефиг распыляться в описании. Одна хотелка - одно пожелание. PNG и GIF это 2 хотелки. Хочешь ещё отдельно GIF - заводи новую. Тем более, что в истории правок тикета видно, что изначально хотелка была про PNG, а GIF был добавлен позже, как "однотипный".

(0005188)
Parasite   
23-01-2012 09:58   
>PNG и GIF это 2 хотелки.
Хотелка ОДНА - прекращение потерь альфа-канала там, где оно нужно.
А я не виноват, что альфа у нас в сас приходит И с гифом, И с пнг. Будет приходить с чем-то третьим - я его тоже сюда допишу, ибо смысл хотелки останется всё в том же: возможность сохранять альфу в тот формат, _в каком оно и пришло_ (или в соседний, коль скоро их два).

PS: Не вижу никакой особой технической сложности сохранять в ГИФ\ПНГ на выходе, коль скоро программой они токи давно и успешно принимаются на входе (то есть, как минимум декодер в проге есть, осталось включить и кодер в эти форматы). Подозреваю даже, что это делается даже той же либой что и другие общераспространенные и открытые форматы.
(0005191)
Tolik   
23-01-2012 10:04   
Parasite, зачем спорить, легче открыть новую хотелку. С png ведь уже работает, стало быть и хотелка д.б. resolved, а с гифом неизвестно когда будет.

Для экспорта в png была присобачена libpng15.dll
Для гифа она, очевидно, не подходит, надо отыскать (или написать) другую.
(0005192)
zed   
23-01-2012 10:04   
Нет, сохранение в GIF нужно прикручивать отдельно. Одно дело открыть/сохранить гифку 256*256 pix, а другое дело нормально сохранить снимок в большом разрешении (out of memory с jpeg'ом ещё помним?).

Так что, не важно, с какими форматами САС умеет работать в режиме просмотра карт, склейка это совсем другая кухня и на каждый формат нужна своя хотелка. Дописывание в уже отработанную хотелку новых пожеланий лишено смысла.
(0005198)
Parasite   
23-01-2012 10:37   
>легче открыть новую хотелку
Кому легче?
Лично мне легче было год назад написать костыль и сделать ту конкретную работу тогда, а не после даты назначения хотелки (назначенной на ..хх, а потом и на ..хххх).

Хотелка тут осталась для тех, кому понадобится тот же функционал ровно в зоне моей же задачи (и посему редактирование\кастрацию оной я и не приветствую).
У кого другие пожелания\другие понимания оной - ать-два в "Создать новый инцидент", а мне-то зачем? Что хотел - я описал выше на момент того запроса, а сейчас оно давно неактуально. Если сделают - будет решпект, нет - так нет, можно вообще закрыть. :)

>нормально сохранить снимок в большом разрешении (out of memory с jpeg'ом ещё помним?)
Ну ГИФ намного "легче" жпега (и даже ПНГ, если ничего не путаю). "Снимок в большом разрешении" и так создается САСом для сохранения в любой формат (перед кодированием собственно в файл). Задача, имхо, брать линию с того "большого разрешения"\переводить в индексн.цвета\писать в файл, повторить пока линии не кончатся. Чтобы на одной линии вылез "out of memory" - это еще надо очень постараться.... Это если безо всяких либ. Имхо, повторюсь - кодингу САСа я не советчик, но если бы делал я - я бы делал именно так. :)
(0005199)
zed   
23-01-2012 10:58   
>"Снимок в большом разрешении" и так создается САСом для сохранения в любой формат
Неа, САСом создаётся только битмапка 256*TargetWidth.

>Это если безо всяких либ.
Без всяких либ, при сохранении что в jpeg, что в png, что в gif будет out of memory. Либы умеют клеить снимки без дикого использования памяти, а вот внутренний компонент - нет, он создаёт (пытается) в памяти целиком битмапку, а потом только её кодирует.
(0005202)
Parasite   
23-01-2012 12:10   
>САСом создаётся только битмапка 256*TargetWidth.
Вот в его пределах и плясать 256 раз, получая однопиксельные полоски и топча их в индекс и затем в out. Не?
(0005204)
zed   
23-01-2012 14:30   
Да.