2012-03-15 3 views
0

URLからキャンバスに画像を読み込み、dataUrlを取得して画像のサイズを調べようとしています。atob()を使用してcanvas toDataUrl()のファイルサイズを返す

この結果、イメージは必要以上に大きく表示されます。

たとえば、60kbイメージを読み込むと、デコードされた変数は134kbに戻ります。

自分のPCにローカルに保存されている画像に同じコードを実行すると、代わりにファイル入力からファイルオブジェクトを取得し、戻り値が正しい(たとえば60kb)。

これは私が使用していたコードです:

  var canvas = document.getElementById('canvas'); 
      var ctx = canvas.getContext('2d'); 
      var img = '/anImage.jpg'; 
      var image = document.createElement('img'); 

      image.src = img; 

      ctx.drawImage(image, 500, 500); 

      ctx.drawImage(image, img.width, img.height); 

      var dataUrl = canvas.toDataURL('image/jpeg'); 

      var d = dataUrl.substr(dataUrl.indexOf('base64,') + 7); 
      var decoded = atob(d); 

      var size = decoded.length; 

私は再び出力にdataUrlを使用して画像を試してみましたが、それを保存している...まだ画像で134キロバイトではなく、元の大きさにもたらされます60Kbの。

私は、base64エンコーディングが画像を1.37倍大きくするが、ファイル入力からイメージオブジェクトを取得するときは値が正しいことを理解しています。

圧縮レベルが失われているかどうかわかりませんか?または、私は何とかファイルオブジェクトからこれを取得し、それを使用してtoDataUrl()関数の2番目のパラメータを設定することができますか?

私はあなたがそれがホストされている画像に簡単なHEAD要求を行うことができますので、任意の情報をいただければ幸いです。このオンライン:)

+0

あなたのコードが動作することはできません。 'drawImage'メソッドの第1引数は、画像または別のキャンバス要素でなければなりません。文字列ではありません。 –

+0

残念ですが、そこには 'document.createElement( 'img');があります。修正するために編集: – Lishamatish

+0

'crawImage'メソッドを' image.onload'イベントで実行する必要があります。イメージがまだ(完全に)ロードされていない可能性があります。その結果、塗装された画像は不完全である。 –

答えて

0

はバイト単位で画像のサイズを取得するために特異的に関連するあらゆる情報を見つけることができません。例えば

var xhr = new XMLHttpRequest(); 
xhr.open('HEAD', '/anImage.jpg', true); 
xhr.onreadystatechange = function(){ 
    if (xhr.readyState == 4) { 
     if (xhr.status == 200) { 
      console.log('size: ' + xhr.getResponseHeader('Content-Length')); 
     } 
    } 
}; 
xhr.send(null); 
+0

実際の画像サイズを取得するのに非常に便利です。私の問題は、画像を操作してキャンバスから新しい画像サイズを取得しようとしているため、間違った値が残っていることです。 – Lishamatish

関連する問題