2014-04-26 88 views
1

由於瀏覽器知道如何處理JPG文件,有沒有辦法讓它們動態地顯示JPG文件的實際二進制數據並允許它們解碼它?JavaScript - 從二進制JPG數據創建圖像

我無法提供該文件作爲正常的image.src =「path.jpg」,因爲數據最初是在JS中解析的另一個文件的一部分。

此外,我有奇怪的JPG文件存儲阿爾法,所以像https://github.com/notmasteryet/jpgjs庫不能處理它們。

+0

有沒有辦法讓瀏覽器讀取二進制代碼,最接近你可能是base64,現代瀏覽器將讀取。 – adeneo

+0

爲了得到base64字符串,我需要先解碼JPG,然後再開始。 – user2503048

+0

「存儲阿爾法的怪異JPG文件」是什麼意思?這真的是2圖像文件:表示alpha通道的jpg +灰度圖像?如果是的話,那麼(1)分開這兩個圖像,(2)用像jpgjs這樣的庫對它們進行解碼,(3)從解碼的jpgs創建2個javascript圖像對象,(4)創建2個畫布並將兩個圖像繪製到畫布, (5)使用context.getImageData將顏色.jpg中的rgb通道與灰度.jpg中的alpha遮罩相結合,(6)使用context.putImageData將組合像素數據寫入畫布,(7)使用canvas.toDataURL創建base64圖像數據。 – markE

回答

6

您可以使用Blob s從二進制數據創建對象,稍後您將該對象作爲圖像解碼的URL傳遞。假設你已經存儲類型數組的二進制數據,你可以做這樣的事情:

var blob = new Blob([myTypedArray], {type: 'application/octet-binary'}); 
var url = URL.createObjectURL(blob); 

現在,您可以通過該網址爲圖像的源:

var img = new Image; 
img.onload = function() { 
    URL.revokeObjectURL(url); 
    ... 
}; 
img.src = url; 

請注意,您仍然有保證您傳入的數據是瀏覽器可以處理的有效圖像格式。

+0

這看起來很棒,但遺憾的是它會掉落Alpha通道(全部變成不透明):( – user2503048

+0

Alpha不透明的像素會發生變化,所以我假設瀏覽器預先乘上Alpha通道然後刪除它。太糟糕了,因爲這是輝煌和快速的(並且比30KB +解碼器小得多)。 – user2503048