Страница 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
Но, используя простую программу для просмотра изображений я у меня в итоге черный квадрат.
это как раз нормально :roll:

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а) ... копируйте палитру, и считайте свои интервалы. Будет как на сайте :mrgreen:

Re: geotiff

Добавлено: 04 окт 2015, 22:02
Ariki
Не обязательно разбивать на интервалы: можно оставить в файле 16-битные целочисленные высоты и к ним применить палитру. Тогда и данные будут целы, и отображаться будут нормально, но палитра будет довольно объёмная.

Но я подозреваю (хотя могу ошибаться, не вникал в тонкости кода), там в приведённом коде устанавливаемые теги не соответствуют реальному количеству бит на пиксель.

Кроме того, не факт, что "простая программа просмотра изображений" вообще умеет работать с палитрами TIFF. Тогда действительно, только конвертировать в RGB.

И для этого есть gdal_translate, можно поэкспериментировать с ним, прежде чем писать свой велосипед.