Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227

Как создать GeoTiff

19.09.2025, 00:02. Показов 2239. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не знаю куда писать, пусть сюда.

Есть bmp файлы (карта) которую генерит прога, и известны географические координаты например 4-х углов,
как из этого создать файл GeoTiff наиболее простым способом и желательно встроить в программу на Buildere ?

Я так понимаю есть два способа :
1) использовать сторонние библиотеки (GDAL ? ) (как их прикрутить к проекту неясно )
2) вручную прописать все директории в файле Tiff (так и не нашел внятного описания где там что прописывать)

Может кто сталкивался покажет дорогу ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2025, 00:02
Ответы с готовыми решениями:

Создать файл GeoTiFF на C++
Добрый день! Может пишу не в той ветке, так что не судить строго. Но суть вопроса следующая: мне...

GeoTiff - примеры ее использования на языке c , желательно на русском языке
Добрый вечер. Дана курсовая с использованием библиотеки GeoTiff. Подскажите где можно прочитать про...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

47
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 00:24  [ТС]
Вопрос попроще, как можно менять директории в tiff файле ?
Описание GeoTiff подсказали где смотреть
https://gis-lab.info/docs/geotiff-1.8.2.pdf

Добавлено через 3 часа 43 минуты
В общем вопрос переходит :

если рассматривать tiff файл как набор байтов,
каким образом можно менять отдельные байты в нем а также
записывать в любом месте последовательность байт ?
Вероятно прочитать его в одномерный массив, поменять что нужно а потом
записать обратно ?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 01:49
Цитата Сообщение от whale2 Посмотреть сообщение
если рассматривать tiff файл как набор байтов,
каким образом можно менять отдельные байты в нем а также
записывать в любом месте последовательность байт ?
Открыть как бинарный файл.
Любой интерфейс работы с бинарным файлом дает возможность позиционировать на место последующего чтения/записи.

Вот только я бы не стал копаться формате TIFF.
Как то раз я знакомился, и формат довольно сложный.
GeoTiff судя по количеству страниц спецификации, ничуть не проще.
Просто уйму времени потратишь.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 09:29  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Вот только я бы не стал копаться формате TIFF.
Да тут просто трындец какой то, более невнятного запутанного описания еще не видел, понапридумывали всякой херни и специально делают так чтобы никто не понял )
У меня простая задача - написать минимальный заголовок для tiff файла и склеить его с данными,
потом тоже самое сделать с модификацией для Geo,
те заголовок будет всегда один и тот же за исключением координат верхнего левого угла и переменных поворота и масштаба на пиксель.
Пока разбираюсь с директориями, дальше заголовка из 8 байт пока не прошел )

Вот например 4 последние байта заголовка это смещение от 0 байта заголовка на первый байт первой директории ? Как то не похоже на примере.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 09:35  [ТС]
Вот например последние 4 байта равны 5*16=80 бйт от начала те
первый байт первой директории равен 10h те всего 16 полей ?
Миниатюры
Как создать GeoTiff  
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 10:10  [ТС]
А тип первого поля = 0 ?


Может есть какое то внятное описание, я нашел только от
А.Самотохина Институт прикладной математики AH CCCР Москва, 1991 г.
но там все крайне запутано и все его перепечатывают.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 11:01
Цитата Сообщение от whale2 Посмотреть сообщение
Пока разбираюсь с директориями, дальше заголовка из 8 байт пока не прошел )
"директории" - что это?
По контексту, понимается что это блоки формата файла.
Но звучит дико и непонятно.

Цитата Сообщение от whale2 Посмотреть сообщение
У меня простая задача - написать минимальный заголовок для tiff файла и склеить его с данными,
потом тоже самое сделать с модификацией для Geo,
Задача понятная, но вот так просто не получится.
Я бы всё же попытал счастья с GDAL.
И либо перешел на MSVC и установил бе её через nuget/vcpkg.
Ну или попробовал бы собрать из исходников через cmake для Borland, если уж такая крайняя необходимость
(хотя кажется без танцев с бубном в этом случае не обойтись, для Borland).

Ну и ещё вариант, использовать консольные утилиты для необходимых преобразований.
bmp -> tiff | tiff -> geotiff
Судя из этой ссылки это видится вероятно возможным.

Добавлено через 5 минут

Не по теме:

Из последующей статьи из той же ссылки :

Послесловие
Несмотря на кажущуюся простоту, для меня весь процесс получения картинки со спутника и наложение её на карту, занял два года. В течении этого времени были и радость открытия и полное отрицание получившихся результатов. Но я очень горд тем, что прошёл весь путь. Ведь я смог разобраться в нескольких совершенно несвязанных областях знаний и добиться финального результата.
Так что не знаю как и относится к ней.
:)

0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 11:06  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я бы всё же попытал счастья с GDAL.
По моему это будет еще сложнее
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 11:29
Цитата Сообщение от whale2 Посмотреть сообщение
По моему это будет еще сложнее
Установить библиотеку или разобрать и реализовать работу с одним из самых сложных форматов изображений которые я встречал..
Ну мне нечего добавить.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 12:50  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
"директории" - что это?
По контексту, понимается что это блоки формата файла.
Но звучит дико и непонятно.
Да не, вроде понятно, я уже немного въехал,
директория описывает одно изображение, в tiff может быть несколько изображения, для каждого своя директория,
директории делятся на поля, по 12 байт, в них указываются все параметры изображения, если не хватает 12 байт в поле есть ссылку где будет более развернутое описание.

В представленом файле 50 00 00 00 - > 5*16=80 байт от нуля (сначало идут мл байты) это начало 6й строки начало первой директории -> идет
10 00 -> 1*16= 16 те всего 16 полей по 12 байт в директории, тут директория одна,
первая поле далее
FE 00 04 00 01 00 00 00 00 00 00 00 те тип = FE 00 ->NewSubfileType
далее
00 01 04 00 01 00 00 00 0A 00 00 00 те тип = 00 01 ->ImageWidth, здесь указана ширина 0A те 10 пикселей что верно

итд не все так уж и сложно
мне всякие сжатия и извращения не нужны, самое простое.

Добавлено через 49 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
установить библиотеку
Это не библиотека а капец какой то причем только на 64 бит машине.

Вот нашел более менее внятное описание tiff правда на англицком
можно частями переводить более менее понятно
https://paulbourke.net/dataformats/tiff/tiff.pdf

Добавлено через 1 час 16 минут
Как в buildere проще загнать tiff в массив и обратно выгрузить ?
Попробую написать для начала читалку всех этих директорий.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 13:25
Цитата Сообщение от whale2 Посмотреть сообщение
Как в buildere проще загнать tiff в массив и обратно выгрузить ?
Я хз. Но в массив, такой себе вариант.
Справка: Using Streams, Using File Streams, System.Classes.TMemoryStream
От нейронки (@"System.Classes.TMemoryStream from file example c++"):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <System.Classes.hpp>
#include <Vcl.Dialogs.hpp> // For ShowMessage
 
void LoadFileIntoMemoryStream(const UnicodeString& FileName)
{
    TMemoryStream* MemStream = nullptr;
    try
    {
        // Create an instance of TMemoryStream
        MemStream = new TMemoryStream();
 
        // Load the contents of the file into the memory stream
        MemStream->LoadFromFile(FileName);
 
        // At this point, the file's content is in MemStream.
        // You can now access the data using MemStream->Memory (a pointer to the buffer)
        // and MemStream->Size (the size of the data in bytes).
 
        // Example: Displaying the size of the loaded data
        ShowMessage("File loaded successfully. Size: " + IntToStr(MemStream->Size) + " bytes.");
 
        // You can also reset the position and read from it if needed
        MemStream->Position = 0;
        // ... further processing of the stream ...
    }
    catch (Exception& E)
    {
        ShowMessage("Error loading file: " + E.Message);
    }
    if (MemStream != nullptr)
    {
        delete MemStream; // Free the memory stream
    }
}
 
// Example usage (e.g., in a button click handler):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // Assuming "C:\\MyFile.txt" exists
    LoadFileIntoMemoryStream("C:\\MyFile.txt");
}
Добавлено через 7 минут
Читать из него так же как и из файла через System.Classes.TCustomMemoryStream.Read.
Reads up to Count bytes from the memory stream into Buffer and advances the current position of the stream by the number of bytes read.
1
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 13:28  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но в массив, такой себе вариант.
Спасибо посмотрю.

Что то пока не понял а где само изображение в tiff,
вот открываю красный квадрат 20х20пикселей, (HxD Editor)
сначало заголовок 8 байт,
потом непонятная область (выделил)
потом все что ниже выделенного это 100% описание директории,
получается выделенное это и есть красные пиксели ? Как то они неравномерные )
По размеру вроде все совпадает.
Миниатюры
Как создать GeoTiff  
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 13:35
whale2, я ещё раз повторю, там очень мутный формат, ну прям цензура не позволяет описать насколько.
Это не плохо, всё это зачем то было нужно, но самому это ковырять, это просто жесть.
Возьми перекур, и на минутку просто ознакомься: https://ru.wikipedia.org/wiki/TIFF

Добавлено через 1 минуту
Хотя может я и путаю его с каким то другим...
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 13:39  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
я ещё раз повторю, там очень мутный формат
Да не, осилим,
а как читать байты из
MemStream->Memory не понял ?


MemStream->Memory[1] это второй байт итд ?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 14:04
Цитата Сообщение от whale2 Посмотреть сообщение
MemStream->Memory[1] это второй байт итд ?
Я же написал. Через Read().
Считать второй байт, будет выглядит примерно так:

C++
1
2
ms->Seek(1, soBeginning);
ms->ReadBuffer(buf, 1);
Методы TMemoryMemory
Можно читать Read, но тут лучше даже ReadBuffer, так как нам нужна гарантия что прочитается ровно необходимое количество байт..
Чем он лучше массива? Для чтения, мало чем, кроме того что можно контролировать выходы за массив и последовательное чтение.
Для записи же, намного лучше, так как он ведет себя как поток, можно добавлять данные.

Добавлено через 15 минут
Цитата Сообщение от whale2 Посмотреть сообщение
MemStream->Memory[1] это второй байт итд ?
Memory ?
Ну если слишком сильно хочется всё вручную, каждую блоху ловить, каждый байт считать, но ошибки и баги будет веселей отлавливать. При этом располагая полным набором инструментов?
C++
1
2
const System.Byte* buf = (const System.Byte*)MemStream->Memory;
buf[1]; // теперь это второй байт, если не вышли за пределы )
Но нужно предупредить, Билдера нет, и писал на нем немного и давно.
Тут лучше найти другого куратора по Борланд С++.
1
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 19:26  [ТС]
Прогресс налицо,
прога читает поля директории, правда только в одностраничном tiff
пока сделал по рабочекрестьянскому через FileRead, то что предлагал ИИ не хочет работать.
Вложения
Тип файла: rar Project1.rar (198.4 Кб, 8 просмотров)
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 19:42  [ТС]
Тут лучше
Вложения
Тип файла: rar Project2.rar (198.9 Кб, 4 просмотров)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2025, 19:48
Исполняемые файлы нет никакого смысла выкладывать.
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 20:05  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Исполняемые файлы нет никакого смысла выкладывать.
Кто захочет посмотрит.

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

В принципе у меня картинка всегда одна и та же так что главное понять принцип, можно уже начать изучать GeoTif
Миниатюры
Как создать GeoTiff  
0
1 / 1 / 0
Регистрация: 20.10.2011
Сообщений: 227
20.09.2025, 22:47  [ТС]
Добавлено через 28 минут
Понял как адресуются данные, напишу сюда чтобы не забыть

изображение делится на секции по некоторому кол-ву строк,
может быть и одна секция на все изображение,

кол-во строк в секции задается в
RowsPerStrip Tag= 278
если оно равно высоте изображения то значит одна секция,

адрес (или сдвиг от начала) для секции задается в
StripOffsets Tag= 273

кол-во байт в секции после компрессии задается в
StripByteCounts Tag= 279
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.09.2025, 22:47
Помогаю со студенческими работами здесь

Как создать класс кот может создать general purpose counting objects
Как создать класс (CounterType) кот может создать general purpose counting objects. Этот объект...

Подскажите, нужно перегрузить оператор или создать метод(если создать то не понимаю как) записи в файл
вот как я хотел сделать запись в файл перегрузкой #pragma once #include &quot;iostream&quot; #include...

Создать класс vector3d, задаваемый тройкой координат. Создать конструктор. Перегрузить операции как методы класса:
Создать класс vector3d, задаваемый тройкой координат. Создать конструктор. Перегрузить операции как...

Создание кода программы с нуля!! создание кода C++
ВОТ УСЛОВИЕ : Для данного вещественного x,a,b,c найти значение следующей функции f,принимающей...

Создать программу, в которой можно создать папку
Всем привет, Подскажите плиз как можно осуществить такое: 1. Есть форма1. 2. В ней мы можем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru