Сохранять глубину цвета импортированных изображений

При импорте изображений с

loadImage("...")

Команда, перебирая пиксели следующим образом:

img.loadPixels(); 
int w = img.width;
int h = img.height;
for (int y = 0; y < h; y++) {
  for (int x = 0; x < w; x++) {
    int loc = x + y*w;
    float r = red(img.pixels[loc]);
    float g = green(img.pixels[loc]);
    float b = blue(img.pixels[loc]);
    println(r + ", " + g + ", " + b);
  }
}

Значения R G B всегда кажутся между 0 и 255, даже если файл изображения имеет глубину 16 бит на канал, где значения должны быть между 0 и 65 535. Можно ли сохранить правильную глубину цвета?


person Walter Lars Lee    schedule 04.06.2017    source источник
comment
Разве нельзя просто умножить числа на 65535/255?   -  person Kevin Workman    schedule 04.06.2017
comment
Это не сработает, потому что, хотя числа r g и b хранятся как числа с плавающей запятой, они в основном являются целыми числами, поэтому умножение на самом деле не восстанавливает исходную глубину.   -  person Walter Lars Lee    schedule 05.06.2017
comment
Функции red(), green() и blue() возвращают нормализованное значение. Может быть, попробовать получить доступ к значению pixels[loc] напрямую, вместо того, чтобы передавать его через функции цвета?   -  person Kevin Workman    schedule 05.06.2017
comment
Хороший момент, но, похоже, это тоже не работает, поскольку внутри пикселей [] данные уже представлены в 32-битном цветовом формате, с 8-битным для каждого A, R, G и B. Я начинаю думать, что это необходимо для создания пользовательской функции loadImage (...).   -  person Walter Lars Lee    schedule 06.06.2017
comment
Что это за язык?   -  person Mark Ransom    schedule 08.07.2017
comment
Используемый здесь язык называется обработкой (см. Processing.org)   -  person Walter Lars Lee    schedule 08.07.2017


Ответы (1)


Вы не сказали, из какой библиотеки используется команда loadImage. Может быть и 16-битная версия, но вряд ли. 24 бита - это своего рода стандарт, подходящий для любой работы, кроме очень высокого уровня.

Я предлагаю вам взглянуть на мой загрузчик TIFF (который, как и loadImage, возвращает 24-битные изображения), и изменить его, чтобы он возвращал 16-битные каналы. Это не сложно, просто случай не отбрасывать младшие биты больших изображений каналов (float и 16 bit).

Это загрузчик TIFF: https://github.com/MalcolmMcLean/tiffloader.

person Malcolm McLean    schedule 04.06.2017