Страница 1 из 2
geotiff
Добавлено: 04 окт 2015, 17:28
Wurtion
Здравствуйте! Использую библиотеку libtiff и geotiff. С созданием geotiff - файла всё получилось. Но никак не получается записать в этот файл информацию о высотах. Пробывала функцию TIFFWriteScanline - ничего не вышло. Может подсказать, как это сделать?
Re: geotiff
Добавлено: 04 окт 2015, 17:31
trir
Что? куда? зачем?
Высота=Цвет
Re: geotiff
Добавлено: 04 окт 2015, 17:35
Wurtion
С помощью какой функции записать цвет в файл? У меня пустой tiff - файл создается. Просто черный квадрат.
Re: geotiff
Добавлено: 04 окт 2015, 17:36
Wurtion
хорошо, а как тогда быть, если высота > цвета. Например высота 1000 м. А цветовая палитра начинается для высоты от 500 м?
Re: geotiff
Добавлено: 04 окт 2015, 17:43
trir
Re: geotiff
Добавлено: 04 окт 2015, 18:56
Ariki
Вы не описали толком ни что хотите получить, ни в чём проблема. Хоть бы код привели.
Целочисленный у вас растр или с плавающей точкой, или, может, индексированный? Вам нужны в растре значения высот или их цветовое отображение в соответствии с какой-то RGB-палитрой? Пробовали ли читать записанный растр программно? Чем смотрели растр? Если просмотровщик показывает чёрный квадрат, это не всегда значит, что растр пустой.
GDAL выше правильно посоветовали, хотя можно и без него, он всё равно использует libgeotiff под капотом. Можно почитать
вот это, чтобы иметь представление о возможностях и особенностях формата.
Re: geotiff
Добавлено: 04 окт 2015, 19:20
gamm
Wurtion писал(а):С помощью какой функции записать цвет в файл?
цвет в файл записать нельзя, в файле числа лежат, у них нет ни цвета, ни вкуса, ни запаха. Эти числа интерпретируются программами просмотра для получения картинки.
Попробуйте сформулировать, чего вы хотите - чтобы какая-то конкретная программа (какая?) показывала какой-то "цвет" (какой), увидев в файле некоторое число (какое)?
Re: geotiff
Добавлено: 04 окт 2015, 21:05
Wurtion
Хорошо, опишу ситуацию подробно: мне нужно залить файл на один сервер. На сервер можно загрузить только geoTIFF. Данный файл geoTIFF должен содержать значения высот (высоты могут быть больше 255). В качестве примера я скачала с этого сервера файл - geoTIFF. С помощью маленькой программы AsTiffTagViewer я узнала параметры примера. Создала проект, подключила библиотеку geotiff и написала следующий код:
Код: Выделить всё
TIFF *tif=XTIFFOpen(fname_1, "r");
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
uint32 npixels=width*height;
uint32 *raster=(uint32 *) malloc(npixels *sizeof(uint32));
TIFFReadRGBAImage(tif, width, height, raster, 0);
TIFFReadRGBAImageOriented(tif, width, height, raster, ORIENTATION_TOPLEFT, 0);
TIFFClose(tif);
unsigned char *data = (unsigned char *)raster;
TIFF *tif_=XTIFFOpen(fname_2, "w");
GTIF *gtif=GTIFNew(tif_);
TIFFSetField(tif_,TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tif_,TIFFTAG_IMAGELENGTH, height);
int sampleperpixel = 1;
TIFFSetField(tif_, TIFFTAG_SAMPLESPERPIXEL, sampleperpixel);
TIFFSetField(tif_,TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tif_, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif_,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
tsize_t linebytes = sampleperpixel * width;
unsigned char *buf = NULL;
if (TIFFScanlineSize(tif_))
buf =(unsigned char *)_TIFFmalloc(linebytes);
else
buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(tif_));
// We set the strip size of the file to be size of one row of pixels
TIFFSetField(tif_, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif_, linebytes));
for (uint32 row = 0; row < height; row++)
{
memcpy(buf, &data[row*linebytes], linebytes);
if (TIFFWriteScanline(tif_, buf, row, 0) < 0)
break;
}
GTIFWriteKeys(gtif);
GTIFFree(gtif);
XTIFFClose(tif_);
В итоге создался geotiff файл, который с горем пополам открывается в продукте ГИС КАРТА 2011. Но, используя простую программу для просмотра изображений я у меня в итоге черный квадрат. Я знаю, что это из-за того, что:
Код: Выделить всё
int sampleperpixel = 1;
TIFFSetField(tif_,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
Чтобы можно было получиться изображение, нужно заменить:
Код: Выделить всё
int sampleperpixel = 3;
TIFFSetField(tif_,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
Но мне нужен именно параметр PHOTOMETRIC_PALETTE, т.к. именно этот флаг установлен в исходном примере.
Вроде бы подробно разъяснила ситуацию.
Re: geotiff
Добавлено: 04 окт 2015, 21:06
Wurtion
На всякий случай прикрепляю пример.
Re: geotiff
Добавлено: 04 окт 2015, 21:07
Wurtion
Пример:
Re: geotiff
Добавлено: 04 окт 2015, 21:11
trir
Но, используя простую программу для просмотра изображений я у меня в итоге черный квадрат.
это как раз нормально

Re: geotiff
Добавлено: 04 окт 2015, 21:13
Wurtion
Нормально, то нормально. Но почему тогда исходный пример с такими параметрами не является ЧЕРНЫМ квадратом?
Re: geotiff
Добавлено: 04 окт 2015, 21:35
Ariki
Вам, видимо, нужен индексированный файл с палитрой. Палитру нужно задать, установив соответствующий тэг:
Тэг COLORMAP
И в таком случае, вам должно хватить 16 бит вместо 32.
upd. Я смотрю, у вас там вообще BITSPERSAMPLE=8. Этого недостаточно, раз у вас есть высоты > 255. Определите, сколько у вас бит на пиксель в исходном файле, и преобразуйте данные или установите правильный тег.
Re: geotiff
Добавлено: 04 окт 2015, 21:52
gamm
Wurtion писал(а):Хорошо, опишу ситуацию подробно: мне нужно залить файл на один сервер. На сервер можно загрузить только geoTIFF. Данный файл geoTIFF должен содержать значения высот (высоты могут быть больше 255).
у вас какая-то путаница. Если в файле должны быть данные, то причем здесь 255? если в файле должна быть картинка, то сотворить ее можно сделав 2 вещи
1) разбить диапазон высот на интервалы, и каждому интервалу придумать цвет. Интервалов может быть и 4, и 16, и 256, и т.д.
2а) значения высот заменить на номера интервалов, и приделать к файлу таблице перевода номера в RGB (палитру), без нее будет Малевич.
2б) создать вместо одного растра с высотами три (в том же файле), в которые поместить RGB, соответствующие высоте.
для начала определитесь, данные у вас в файле (высоты), или картинка - это разные вещи.
P.S. посмотрел - в файле sf-sfdem.tif не данные, а мурзилка с палитрой (2а) ... копируйте палитру, и считайте свои интервалы. Будет как на сайте

Re: geotiff
Добавлено: 04 окт 2015, 22:02
Ariki
Не обязательно разбивать на интервалы: можно оставить в файле 16-битные целочисленные высоты и к ним применить палитру. Тогда и данные будут целы, и отображаться будут нормально, но палитра будет довольно объёмная.
Но я подозреваю (хотя могу ошибаться, не вникал в тонкости кода), там в приведённом коде устанавливаемые теги не соответствуют реальному количеству бит на пиксель.
Кроме того, не факт, что "простая программа просмотра изображений" вообще умеет работать с палитрами TIFF. Тогда действительно, только конвертировать в RGB.
И для этого есть
gdal_translate, можно поэкспериментировать с ним, прежде чем писать свой велосипед.