[英]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寫入)。 然后,使用索引將每個亮度值作為普通數組進行訪問。
但是,如果打算進行大量處理,我建議使用浮點緩沖區而不是具有標准化值的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;
如果源使用伽瑪,則需要在處理之前將伽瑪轉換為線性,完成后,重新應用伽瑪。
您可以隨時進行遮罩/移位操作。 但這不會那么准確。
(畫布將始終使用基於8位的RGBA緩沖區)。
為了易於實現,我們決定以一種捕獲所需全部值的方式將圖像重新編碼為一組RGB值:基本上,將每個像素都視為3位基數256位。
這種回避問題的方式,所以無論如何我都會接受肯·費斯滕伯格的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.