簡體   English   中英

Javascript無符號短灰度圖像

[英]Javascript Unsigned Short Grayscale Images

我正在將類型為TYPE_USHORT_GRAY的Java BufferedImage編碼為base64,以通過REST API將其提供給Javascript客戶端。

我可以在服務器端清楚地檢查在適當范圍(0到65k)內的不同像素值,但是canvas api似乎僅提供rgba像素,這導致我的用例無法接受的精度損失。

客戶端Javascript是否可以通過畫布或其他api讀取和操縱(但不顯示)無符號的短灰度圖像的像素值?

是的,您可以將像素存儲在Uint16Array緩沖區中,然后Uint16Array讀取和寫入亮度值。 請注意,字節順序(網絡/大端與小端)很重要DataView可以幫助您解決這一問題,如果傳入緩沖區是大端的,則只需交換字節序即可。

還要注意,超出范圍的值正在進行模處理,因此您需要手動裁剪(或使用掩碼0xffff寫入)。 然后,使用索引將每個亮度值作為普通數組進行訪問。

但是,如果打算進行大量處理,我建議使用浮點緩沖區而不是具有標准化值的Float32ArrayFloat64Array前者更快,后者更准確。 這也將允許您根據需要推入和推出動態范圍,除非您需要為每個遍歷設定值。

規范化(很明顯,但出於記錄目的):

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;

如果源使用伽瑪,則需要在處理之前將伽瑪轉換為線性,完成后,重新應用伽瑪。

您可以隨時進行遮罩/移位操作。 但這不會那么准確。

(畫布將始終使用基於8位的RGBA緩沖區)。

為了易於實現,我們決定以一種捕獲所需全部值的方式將圖像重新編碼為一組RGB值:基本上,將每個像素都視為3位基數256位。

這種回避問題的方式,所以無論如何我都會接受肯·費斯滕伯格的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM