geotiff

Не знаете, где задать вопрос? Задавайте здесь.
Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

geotiff

Сообщение Wurtion » 04 окт 2015, 17:28

Здравствуйте! Использую библиотеку libtiff и geotiff. С созданием geotiff - файла всё получилось. Но никак не получается записать в этот файл информацию о высотах. Пробывала функцию TIFFWriteScanline - ничего не вышло. Может подсказать, как это сделать?

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: geotiff

Сообщение trir » 04 окт 2015, 17:31

Что? куда? зачем?
Высота=Цвет

Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

Re: geotiff

Сообщение Wurtion » 04 окт 2015, 17:35

С помощью какой функции записать цвет в файл? У меня пустой tiff - файл создается. Просто черный квадрат.

Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

Re: geotiff

Сообщение Wurtion » 04 окт 2015, 17:36

хорошо, а как тогда быть, если высота > цвета. Например высота 1000 м. А цветовая палитра начинается для высоты от 500 м?

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: geotiff

Сообщение trir » 04 окт 2015, 17:43


Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: geotiff

Сообщение Ariki » 04 окт 2015, 18:56

Вы не описали толком ни что хотите получить, ни в чём проблема. Хоть бы код привели.

Целочисленный у вас растр или с плавающей точкой, или, может, индексированный? Вам нужны в растре значения высот или их цветовое отображение в соответствии с какой-то RGB-палитрой? Пробовали ли читать записанный растр программно? Чем смотрели растр? Если просмотровщик показывает чёрный квадрат, это не всегда значит, что растр пустой.

GDAL выше правильно посоветовали, хотя можно и без него, он всё равно использует libgeotiff под капотом. Можно почитать вот это, чтобы иметь представление о возможностях и особенностях формата.

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: geotiff

Сообщение gamm » 04 окт 2015, 19:20

Wurtion писал(а):С помощью какой функции записать цвет в файл?
цвет в файл записать нельзя, в файле числа лежат, у них нет ни цвета, ни вкуса, ни запаха. Эти числа интерпретируются программами просмотра для получения картинки.

Попробуйте сформулировать, чего вы хотите - чтобы какая-то конкретная программа (какая?) показывала какой-то "цвет" (какой), увидев в файле некоторое число (какое)?

Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

Re: geotiff

Сообщение Wurtion » 04 окт 2015, 21:05

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

Вроде бы подробно разъяснила ситуацию.

Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

Re: geotiff

Сообщение Wurtion » 04 окт 2015, 21:06

На всякий случай прикрепляю пример.
Вложения
sf-sfdem.tif
sf-sfdem.tif (194.57 КБ) 10913 просмотров

Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

Re: geotiff

Сообщение Wurtion » 04 окт 2015, 21:07

Пример:

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: geotiff

Сообщение trir » 04 окт 2015, 21:11

Но, используя простую программу для просмотра изображений я у меня в итоге черный квадрат.
это как раз нормально :roll:

Wurtion
Новоприбывший
Сообщения: 11
Зарегистрирован: 14 авг 2015, 09:38
Репутация: 0

Re: geotiff

Сообщение Wurtion » 04 окт 2015, 21:13

Нормально, то нормально. Но почему тогда исходный пример с такими параметрами не является ЧЕРНЫМ квадратом?

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: geotiff

Сообщение Ariki » 04 окт 2015, 21:35

Вам, видимо, нужен индексированный файл с палитрой. Палитру нужно задать, установив соответствующий тэг:
Тэг COLORMAP
И в таком случае, вам должно хватить 16 бит вместо 32.

upd. Я смотрю, у вас там вообще BITSPERSAMPLE=8. Этого недостаточно, раз у вас есть высоты > 255. Определите, сколько у вас бит на пиксель в исходном файле, и преобразуйте данные или установите правильный тег.

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: geotiff

Сообщение gamm » 04 окт 2015, 21:52

Wurtion писал(а):Хорошо, опишу ситуацию подробно: мне нужно залить файл на один сервер. На сервер можно загрузить только geoTIFF. Данный файл geoTIFF должен содержать значения высот (высоты могут быть больше 255).
у вас какая-то путаница. Если в файле должны быть данные, то причем здесь 255? если в файле должна быть картинка, то сотворить ее можно сделав 2 вещи

1) разбить диапазон высот на интервалы, и каждому интервалу придумать цвет. Интервалов может быть и 4, и 16, и 256, и т.д.

2а) значения высот заменить на номера интервалов, и приделать к файлу таблице перевода номера в RGB (палитру), без нее будет Малевич.
2б) создать вместо одного растра с высотами три (в том же файле), в которые поместить RGB, соответствующие высоте.

для начала определитесь, данные у вас в файле (высоты), или картинка - это разные вещи.

P.S. посмотрел - в файле sf-sfdem.tif не данные, а мурзилка с палитрой (2а) ... копируйте палитру, и считайте свои интервалы. Будет как на сайте :mrgreen:
Последний раз редактировалось gamm 04 окт 2015, 22:02, всего редактировалось 1 раз.

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: geotiff

Сообщение Ariki » 04 окт 2015, 22:02

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

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

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

И для этого есть gdal_translate, можно поэкспериментировать с ним, прежде чем писать свой велосипед.
Последний раз редактировалось Ariki 04 окт 2015, 22:08, всего редактировалось 1 раз.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot] и 6 гостей