2015-02-26 2 views
0

Я кодирую Java BufferedImage с типом TYPE_USHORT_GRAY как base64, предоставляя его клиенту Javascript через REST api.Javascript Unsigned Short Grayscale Images

Я могу четко проверить отдельные значения пикселей в правильном диапазоне (от 0 до 65 тыс.) На стороне сервера, но canvas api, по-видимому, обеспечивает только пиксели rgba, что приводит к неприемлемой потере точности для моего варианта использования.

Возможно ли, чтобы клиентский Javascript считывал и обрабатывал значения пикселей (но не отображал) изображение без знака в полутонах с помощью холста или какого-либо другого api?

+0

Вы хотите иметь возможность отображать 16-битные изображения в оттенках серого на холсте? – Phylogenesis

+0

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

+0

Возможно, вам удастся сохранить данные [в «Int16Array'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array) для обработки перед отправкой на холст тогда. – Phylogenesis

ответ

2

Да, вы можете хранить пиксели в буфере Uint16Array, а затем читать и записывать значения яркости в это. Обратите внимание, что размер байта (network/big-endian vs. little-endian) будет иметь значение - DataView может помочь вам в этом или просто поменять байтовый порядок, если входящий буфер является big-endian.

Обратите внимание, что значения за пределами диапазона получают модульную обработку, поэтому вам нужно закрепить их вручную (или написать с использованием маски 0xffff). Затем получите доступ к каждому значению яркости в виде обычного массива с использованием индексов.

Однако, если вы намерены выполнять большую обработку, я бы рекомендовал вместо этого использовать буфер с плавающей запятой с нормализованными значениями, используя либо Float32Array, либо Float64Array - первый быстрее, последний более точный. Это также позволит вам вводить и удалять динамический диапазон, как вам нужно, если только вам не нужно зажимать значения для каждого прохода.

Для нормализации (очевидно, но для записи):

newLum = oldLum/0xffff; 

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

var inDepth = Math.pow(2, 16) - 1; // 65535 
var outDepth = Math.pow(2, 8) - 1; // 255 

то для каждого значения яркости:

var r,g,b,a; 
r = g = b = (lum * outDepth/inDepth + 0.5)|0; // or, in this case - 
r = g = b = (lum * 0.0038910505836575876 + 0.5)|0; 
a = 255; 

Если СОУ rce использует гамму, необходимо будет преобразовать гамма в линейную перед обработкой, когда это будет сделано, повторно использовать гамму.

Вы всегда можете сделать маску/смену op. но это будет не так точно.

(Canvas всегда будет использовать 8-разрядный буфер RGBA).

0

Для упрощения реализации мы решили перекодировать изображение на набор значений RGB таким образом, чтобы отображать весь диапазон значений, которые нам нужны: в основном, обработка каждого пикселя в виде 3-значного базового 256 номера.

Этот вопрос уклоняется, поэтому я буду принимать ответ Кен Фирстенберга независимо от того.

Смежные вопросы