geotiff
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
geotiff
Здравствуйте! Использую библиотеку libtiff и geotiff. С созданием geotiff - файла всё получилось. Но никак не получается записать в этот файл информацию о высотах. Пробывала функцию TIFFWriteScanline - ничего не вышло. Может подсказать, как это сделать?
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: geotiff
Что? куда? зачем?
Высота=Цвет
Высота=Цвет
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
Re: geotiff
С помощью какой функции записать цвет в файл? У меня пустой tiff - файл создается. Просто черный квадрат.
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
Re: geotiff
хорошо, а как тогда быть, если высота > цвета. Например высота 1000 м. А цветовая палитра начинается для высоты от 500 м?
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: geotiff
Вы не описали толком ни что хотите получить, ни в чём проблема. Хоть бы код привели.
Целочисленный у вас растр или с плавающей точкой, или, может, индексированный? Вам нужны в растре значения высот или их цветовое отображение в соответствии с какой-то RGB-палитрой? Пробовали ли читать записанный растр программно? Чем смотрели растр? Если просмотровщик показывает чёрный квадрат, это не всегда значит, что растр пустой.
GDAL выше правильно посоветовали, хотя можно и без него, он всё равно использует libgeotiff под капотом. Можно почитать вот это, чтобы иметь представление о возможностях и особенностях формата.
Целочисленный у вас растр или с плавающей точкой, или, может, индексированный? Вам нужны в растре значения высот или их цветовое отображение в соответствии с какой-то RGB-палитрой? Пробовали ли читать записанный растр программно? Чем смотрели растр? Если просмотровщик показывает чёрный квадрат, это не всегда значит, что растр пустой.
GDAL выше правильно посоветовали, хотя можно и без него, он всё равно использует libgeotiff под капотом. Можно почитать вот это, чтобы иметь представление о возможностях и особенностях формата.
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: geotiff
цвет в файл записать нельзя, в файле числа лежат, у них нет ни цвета, ни вкуса, ни запаха. Эти числа интерпретируются программами просмотра для получения картинки.Wurtion писал(а):С помощью какой функции записать цвет в файл?
Попробуйте сформулировать, чего вы хотите - чтобы какая-то конкретная программа (какая?) показывала какой-то "цвет" (какой), увидев в файле некоторое число (какое)?
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
Re: geotiff
Хорошо, опишу ситуацию подробно: мне нужно залить файл на один сервер. На сервер можно загрузить только geoTIFF. Данный файл geoTIFF должен содержать значения высот (высоты могут быть больше 255). В качестве примера я скачала с этого сервера файл - geoTIFF. С помощью маленькой программы AsTiffTagViewer я узнала параметры примера. Создала проект, подключила библиотеку geotiff и написала следующий код:
В итоге создался geotiff файл, который с горем пополам открывается в продукте ГИС КАРТА 2011. Но, используя простую программу для просмотра изображений я у меня в итоге черный квадрат. Я знаю, что это из-за того, что:
Чтобы можно было получиться изображение, нужно заменить:
Но мне нужен именно параметр PHOTOMETRIC_PALETTE, т.к. именно этот флаг установлен в исходном примере.
Вроде бы подробно разъяснила ситуацию.
Код: Выделить всё
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_);
Код: Выделить всё
int sampleperpixel = 1;
TIFFSetField(tif_,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
Код: Выделить всё
int sampleperpixel = 3;
TIFFSetField(tif_,TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
Вроде бы подробно разъяснила ситуацию.
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
Re: geotiff
Пример:
-
- Гуру
- Сообщения: 5354
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: geotiff
это как раз нормальноНо, используя простую программу для просмотра изображений я у меня в итоге черный квадрат.

-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 14 авг 2015, 09:38
- Репутация: 0
Re: geotiff
Нормально, то нормально. Но почему тогда исходный пример с такими параметрами не является ЧЕРНЫМ квадратом?
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: geotiff
Вам, видимо, нужен индексированный файл с палитрой. Палитру нужно задать, установив соответствующий тэг:
Тэг COLORMAP
И в таком случае, вам должно хватить 16 бит вместо 32.
upd. Я смотрю, у вас там вообще BITSPERSAMPLE=8. Этого недостаточно, раз у вас есть высоты > 255. Определите, сколько у вас бит на пиксель в исходном файле, и преобразуйте данные или установите правильный тег.
Тэг COLORMAP
И в таком случае, вам должно хватить 16 бит вместо 32.
upd. Я смотрю, у вас там вообще BITSPERSAMPLE=8. Этого недостаточно, раз у вас есть высоты > 255. Определите, сколько у вас бит на пиксель в исходном файле, и преобразуйте данные или установите правильный тег.
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: geotiff
у вас какая-то путаница. Если в файле должны быть данные, то причем здесь 255? если в файле должна быть картинка, то сотворить ее можно сделав 2 вещиWurtion писал(а):Хорошо, опишу ситуацию подробно: мне нужно залить файл на один сервер. На сервер можно загрузить только geoTIFF. Данный файл geoTIFF должен содержать значения высот (высоты могут быть больше 255).
1) разбить диапазон высот на интервалы, и каждому интервалу придумать цвет. Интервалов может быть и 4, и 16, и 256, и т.д.
2а) значения высот заменить на номера интервалов, и приделать к файлу таблице перевода номера в RGB (палитру), без нее будет Малевич.
2б) создать вместо одного растра с высотами три (в том же файле), в которые поместить RGB, соответствующие высоте.
для начала определитесь, данные у вас в файле (высоты), или картинка - это разные вещи.
P.S. посмотрел - в файле sf-sfdem.tif не данные, а мурзилка с палитрой (2а) ... копируйте палитру, и считайте свои интервалы. Будет как на сайте

Последний раз редактировалось gamm 04 окт 2015, 22:02, всего редактировалось 1 раз.
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: geotiff
Не обязательно разбивать на интервалы: можно оставить в файле 16-битные целочисленные высоты и к ним применить палитру. Тогда и данные будут целы, и отображаться будут нормально, но палитра будет довольно объёмная.
Но я подозреваю (хотя могу ошибаться, не вникал в тонкости кода), там в приведённом коде устанавливаемые теги не соответствуют реальному количеству бит на пиксель.
Кроме того, не факт, что "простая программа просмотра изображений" вообще умеет работать с палитрами TIFF. Тогда действительно, только конвертировать в RGB.
И для этого есть gdal_translate, можно поэкспериментировать с ним, прежде чем писать свой велосипед.
Но я подозреваю (хотя могу ошибаться, не вникал в тонкости кода), там в приведённом коде устанавливаемые теги не соответствуют реальному количеству бит на пиксель.
Кроме того, не факт, что "простая программа просмотра изображений" вообще умеет работать с палитрами TIFF. Тогда действительно, только конвертировать в RGB.
И для этого есть gdal_translate, можно поэкспериментировать с ним, прежде чем писать свой велосипед.
Последний раз редактировалось Ariki 04 окт 2015, 22:08, всего редактировалось 1 раз.
Кто сейчас на конференции
Сейчас этот форум просматривают: Ahrefs [Bot] и 6 гостей