Как преобразовать A16B16G16R16F в ARGB32? - PullRequest
0 голосов
/ 15 июня 2011

Я пишу программу на C ++, которая читает текстурный файл изображения, затем преобразует и сохраняет как .png.

Когда я встретил ARGB-формат с плавающей точкой с половинной точностью.

Я пыталсякаждый пиксель ARGB-канала

  1. чтение 16 бит
  2. преобразование в 32-битный примитив с плавающей точкой
  3. умножение 255 или 1 (я не уверен, какой диапазон допустимых значенийзначение поплавка)
  4. приведено к значению BYTE

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

Какая формула для преобразования поплавка половинной точности в 8-битное значение интенсивности цвета?

1 Ответ

1 голос
/ 15 июня 2011

Подробности чтения половинных чисел, включая код, описаны в сообщении в блоге здесь:

http://fpmurphy.blogspot.com/2008/12/half-precision-floating-point-format_14.html

После прочтения в своих числах вы должны будете выполнить операцию тонального отображения, чтобы получить значения в диапазоне 0..255, разрешенном для PNG. Эта операция называется «тональным отображением», и у вас есть различные варианты ее выполнения. Очень просто было бы найти максимальное значение на изображении M и масштабировать все значения яркости пикселей на 255 / M , чтобы попасть в нужный диапазон. Однако есть алгоритмы, которые немного более сложны.

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

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