2015-08-28 21 views
1

我在html畫布中繪製圖像。是否有辦法從JS中的圖像手動創建base64code

這是怎麼計算的像素

for (var i = 0; i < data.length; i += 4) { 

      var red = data[i]; // red 
      var green= data[i + 1]; // green 
      var blue = data[i + 2] ; // blue 
      } 

,這是怎麼出來的

var dataURL = canvas.toDataURL('image/png'); 

創建的base64編碼但這對於的RGBA PNG圖像創建的base64編碼。我如何才能從第一個頻道data[i]創建base64代碼,有沒有辦法將其手動編碼爲base64或者提供toDataURL選項來實現?我試圖尋找了文檔,但我找不到任何

感謝

編輯

編輯與坊間建議:

var imageData = ctx.getImageData(0,0,cw, ch); 
    var data= imageData.data   
for (var i = 0; i < data.length; i += 4) { 
      var grayscale = data[i]*0.2126 + data[i +1]*0.7152 + data[i +2]*0.0722; 
      data[i]  = grayscale; // red 
      data[i + 1] = grayscale; // green 
      data[i + 2] = grayscale; // blue 
      } 


var binary = new Uint8Array(data.length); 
for (var i=0; i<data.length; i++){ 
    binary[i]=data[i]; 
} 
var s=binary.toString(); 
var base = btoa(s); 
+0

您可以設置數據說,轉換爲B + W,但畫布輸出選項都將是RGB(有時)。你可以使用'(「image/jpeg」,0.5)'來獲得RGB,相對緊湊 – dandavis

+0

有沒有其他的方法可以做到這一點?我問的原因是,因爲我有一個灰度圖像以便傳遞圖像,所以我不需要其他通道。 – Tom

+0

你可以(1)將剩餘的灰度值保存到'Uint8Array'中,(2)用'var s = myUint8Array.toString()'將該數組字符串化,(3)Base64用'btoa(s)'對該字符串進行編碼。我的問題是你打算如何使用這個結果? – markE

回答

1

,你可以:

  1. 將剩餘的灰度值保存到Uint8Array,
  2. 將該數組與var s=myUint8Array.toString(),
  3. 串聯化,Base64對該字符串進行編碼,其中btoa(s)

這裏的示例代碼:

var canvas=document.getElementById("canvas"); 
 
var ctx=canvas.getContext("2d"); 
 

 
var img=new Image(); 
 
img.crossOrigin = "Anonymous"; 
 
img.onload=function(){ 
 
    canvas.width=img.width; 
 
    canvas.height=img.height; 
 
    ctx.drawImage(img,0,0); 
 
    var uint8 = new Uint8ClampedArray(img.width*img.height); 
 
    var imageData = ctx.getImageData(0,0,canvas.width,canvas.height); 
 
    var data= imageData.data   
 
    for (var i = 0; i < data.length; i += 4) { 
 
    var grayscale = data[i]*0.2126 + data[i +1]*0.7152 + data[i +2]*0.0722; 
 
    uint8[i]=grayscale; 
 
    } 
 
var s=uint8[0]; 
 
for(var i=1;i<uint8.length;i++){ 
 
    s+=','+uint8[i]; 
 
} 
 
    alert('As string: '+s); 
 
    var b64=btoa(s); 
 
    alert('As base64 string'+b64); 
 
    var ss=atob(b64); 
 
    alert('Back to original string'+ss); 
 
} 
 
img.src='https://dl.dropboxusercontent.com/u/139992952/multple/house16x16.jpg'
body{ background-color: ivory; } 
 
#canvas{border:1px solid red; margin:0 auto; }
<canvas id="canvas" width=300 height=300></canvas>

+0

非常感謝你,但是,如果我運行你的代碼,b64將再次是一個空對象 – Tom

+0

它對我來說工作正常...我得到一個有效的Base64編碼Chrome,Firefox,Edge。你是在上面運行我的演示程序還是使用自己的圖像?你是否收到跨域安全違規? – markE

+0

我正在使用您的代碼片段,並將「W29iamVjdCBVaW50OEFycmF5XQ ==」作爲警報 – Tom

相關問題