Страница 1 из 1

rgb2pct и палитры QGIS, GIMP

Добавлено: 16 фев 2010, 16:07
Denis Rykov
Утилита rgb2pct позволяет конвертировать полноцветные растры в индексированные. Это можно сделать одним из двух способов, либо указать количество цветов в результирующем цветоделенном растре:

Код: Выделить всё

rgb2pct -n 50 -of GIF input.tif output.gif
либо использовать уже готовую палитру. Для этого в ключе -pct нужно указать растр, содержащий палитру:

Код: Выделить всё

rgb2pct -pct indexing.gif -of GIF input.tif output.gif
В качестве такого растра может выступать виртуальный VRTDataset. VRTDataset - это простой xml файл, в котором кроме всего прочего можно описать палитру, например:

Код: Выделить всё

    <ColorTable>
      <Entry c1="0" c2="0" c3="0" c4="255"/>
      <Entry c1="145" c2="78" c3="224" c4="255"/>
    </ColorTable>
Если цветов не много, то палитру можно набить и вручную, в случае же большого количества цветов это довольно трудоемкое занятие. Одним из способов получения файла палитры является создание и сохранение его средствами QGIS. Однако, QGIS сохраняет палитру не в формате VRTDataset:

Код: Выделить всё

# QGIS Generated Color Map Export File
INTERPOLATION:EXACT
0,100,68,76,255,Color entry 1
1,188,180,56,255,Color entry 2
3,156,216,172,255,Color entry 3
6,72,192,188,255,Color entry 4
7,136,176,200,255,Color entry 5
Вот для перевода QGIS-овской палитры в палитру VRTDataset я и набросал следующий скрипт:

Код: Выделить всё

import sys
QGisPalette = open(sys.argv[1], "r")
VRTPalette = open(sys.argv[2], "wt")
VRTPalette.write('<VRTDataset rasterXSize="640" rasterYSize="480">\n')
VRTPalette.write('    <VRTRasterBand dataType="Byte" band="1">\n')
VRTPalette.write('        <ColorTable>\n')


for line in QGisPalette.readlines():
        if line[0].isdigit():
            VRTPalette.write('            <Entry c1="'+str(line.split(',')[1])+'" c2="'+str(line.split(',')[2])+'" c3="'+str(line.split(',')[3])+'" c4="'+str(line.split(',')[4])+'"/>\n')

VRTPalette.write('        </ColorTable>\n')
VRTPalette.write('    </VRTRasterBand>\n')
VRTPalette.write('</VRTDataset>\n')
QGisPalette.close()
VRTPalette.close()
rasterXSize="640" rasterYSize="480" - особой роли не играют, но без их определения rgb2pct не хочет работать.
Может, конечно, и некрасиво получилось, зато работает :)

Re: rgb2pct и палитра QGIS

Добавлено: 16 фев 2010, 20:07
Voltron
Маленькое дополнение. Параметр -pct появился в gdal 1.7.0 в более старых версиях его нет (или я плохо искал?)

Re: rgb2pct и палитра QGIS

Добавлено: 17 фев 2010, 04:00
Максим Дубинин
именно так, в 1.7

Re: rgb2pct и палитра QGIS

Добавлено: 17 фев 2010, 09:53
Mavka
Voltron
Ticket 2958

Re: rgb2pct и палитра QGIS

Добавлено: 17 фев 2010, 09:57
Максим Дубинин
Mavka, так это ты был автором этого дела?

Re: rgb2pct и палитра QGIS

Добавлено: 17 фев 2010, 10:25
Voltron
Это конечно хорошо, добавлю в свою установку. Только вот кугис пока линкуется со старой версией... Жаль, а то бы в GdalTools включил

Re: rgb2pct и палитра QGIS

Добавлено: 17 фев 2010, 11:21
Mavka
sim
Изображение

Re: rgb2pct и палитры QGIS, GIMP

Добавлено: 28 мар 2010, 21:39
Denis Rykov
Небольшие поправки и скрипт пригоден для перегонки палитры GIMP-а в VRT:

Код: Выделить всё

import sys
gplPalette = open(sys.argv[1], "r")
VRTPalette = open(sys.argv[2], "wt")
VRTPalette.write('<VRTDataset rasterXSize="640" rasterYSize="480">\n')
VRTPalette.write('    <VRTRasterBand dataType="Byte" band="1">\n')
VRTPalette.write('        <ColorTable>\n')


for line in gplPalette.readlines():
        if (line[0].isdigit() or line[0]==' '):
            VRTPalette.write('            <Entry c1="'+str(line.split()[0])+'" c2="'+str(line.split()[1])+'" c3="'+str(line.split()[2])+'" c4="'+str(line.split()[3])+'"/>\n')

VRTPalette.write('        </ColorTable>\n')
VRTPalette.write('    </VRTRasterBand>\n')
VRTPalette.write('</VRTDataset>\n')
gplPalette.close()
VRTPalette.close()