и спасибо за все ваши быстрые и подробные ответы. Я был приятно удивлен, так как в последний раз, когда я использовал форум (Eclipse), я помню, что получал ровно ноль ответов после целого месяца ...
В любом случае, прежде чем я смогу попробовать различные предложенные вами решения, я хотел сначала отреагировать на превосходную точку зрения Дэвида Шварца: да, мой вопрос определенно является вопросом XY, и да, я совершенно не упомянул контекст, который привел меня к этой экзотической ситуации, и каковы мои реальные потребности.
Короче говоря, я действительно хочу прочитать содержимое изображения tiff (спутниковое изображение только с полутоновыми значениями, без RGB или любой цветовой комбинации), используя gdal в C ++, а затем выполнить несколько простых операции, некоторые из них как basi c как получение правильных значений пикселей. Звучит просто как ад, не так ли? Теперь в реальной жизни все становится кошмаром, когда используется gdal (который столь же мощен, как crypti c) и НЕ знает заранее фактический тип данных пикселей (который может быть в основном любым типом int или с плавающей точкой с любой точностью). Насколько я мог понять с помощью учебных пособий, примеров и форума, gdal предлагает мне только 2 (едва удовлетворительных) способа чтения содержимого изображения tiff:
1) либо я точно знаю тип данных пикселей моего изображения (ex int16), и я должен где-то жестко закодировать его, что я не могу себе позволить (и шаблоны здесь не помогут, так как в определенный момент мне приходится хранить содержимое моего изображения в переменной, а это значит, что я должен знать его точное type).
2) или я могу прочитать изображение любого типа данных пикселей, но используя автоматическое преобразование c в заданный целевой тип (ex float64, чтобы охватить все возможные диапазоны значений). Звучит удобно и легко, но недостатком является то, что это систематическое c преобразование является потенциально огромной тратой времени и памяти (вспомните uint8 в исходном массиве, преобразованном в float64 в целевом массиве!). Безумный вариант для меня, так как я обычно работаю с очень большими изображениями (например, с несколькими гигапикселями!)
3) Я сам определился с некрасивым / неуклюжим альтернативным решением, где я позволил gdal загрузить изображение содержимое в виде «необработанного двоичного» содержимого (официально это массив байтов), а затем, в конце концов, пытается прочитать его обратно, интерпретируя его в соответствии с реальным типом данных (который gdal может сообщить мне позже). Хорошей стороной является то, что точное двоичное содержимое изображения загружается без какого-либо преобразования, поэтому лучшая скорость и использование памяти. Недостатком является то, что я в конечном итоге пытаюсь поиграть с этими двоичными данными, чтобы правильно их интерпретировать, избегая любых копий или математических операций.
Так вот что привело меня в эту неуклюжую попытку «на месте -интерпретация »моих данных, или как там их собственное имя, просто потому, что я думал, что это будет очень простой и последний шаг к выполнению работы, но я могу ошибаться, и я мог пропустить более простые / более чистые решения (на самом деле У меня есть sh У меня есть!).
Несколько заключительных мыслей о том, чтобы "де-Y" ответить на мой вопрос XY !!!
_ использование библиотеки gdal представляется здесь почти обязательным, поскольку Насколько я знаю, это единственная библиотека, которая может правильно обрабатывать изображения, с которыми я имею дело, то есть многополосные TIFF-изображения (другие библиотеки обычно всегда рассматривают 3 полосы и слепо интерпретируют их как компоненты цвета RGB, что совершенно не то, что Я хочу здесь).
_ также я быстро попробовал с gdal для python, но обработал гигапиксельное большое изображение s в python звучит определенно как неправильный выбор. Более того, моим следующим шагом должно быть создание базового c интерактивного средства просмотра изображений (возможно, с использованием Qt), поэтому скорость выполнения действительно имеет значение.
_ Я много упоминал с использованием std :: vector, потому что думал, что это будет было бы легче играть, но, вероятно, массив старой школы C справился бы с работой.
_ наконец-то я увидел много ответов, в которых упоминалась проблема выравнивания, это действительно то, с чем мне не очень удобно и что я бы не стал не люблю связываться с ...
Итак, еще раз, любые дальнейшие советы приветствуются, включая отказ от некоторых моих предыдущих попыток, если это может упростить ситуацию и предложить более прямое решение, о котором я действительно мечтаю.
Еще раз спасибо.