2014-01-09 2 views
1

다음 코드는 .png 이미지를 로컬 하드 드라이브에 저장하거나 로컬 하드 드라이브에서로드 할 수 있어야합니다.javascript blob을 사용하여 로컬 하드 드라이브에서 이미지로드

절약은 (적어도 크롬에) 잘 작동하지만 부하는 잘못된 URL을 생성하고 아무것도 표시하지 .. 좀 도와 정말 감사하겠습니다

! 당신의 FileReader에 대한

<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <img id="img" /><br> 
    <input type="button" value="Save" onclick="onSave()" /><br /> 
    <input type="file" onchange="onOpen(event)" /><br /> 

    <script> 

     onSave = function() { 
      var canvas = document.createElement("canvas"); 
      canvas.width = 200; 
      canvas.height = 200; 

      var ctx = canvas.getContext("2d"); 
      ctx.fillRect(0, 0, 100, 150); 

      var dataURL = canvas.toDataURL("image/png"); 
      var img64 = dataURL.replace(/^data:image\/(png|jpg);base64,/, ""); 

      var binaryImg = atob(img64); 
      var length = binaryImg.length; 
      var ab = new ArrayBuffer(length); 
      var ua = new Uint8Array(ab); 
      for (var i = 0; i < length; i++) { 
       ua[i] = binaryImg.charCodeAt(i); 
      } 

      var blob = new Blob([ab]); 

      var a = document.createElement("a"); 
      a.download = 'Blob_img'; 
      a.innerHTML = "Download File"; 
      a.href = window.webkitURL.createObjectURL(blob); 
      a.style.display = 'none'; 
      document.body.appendChild(a); 
      a.click(); 
     }; 


     onOpen = function (event) { 
      var fileReader = new FileReader(); 
      fileReader.onload = function (event) { 
       var ab = event.target.result; 

       var ua = new Uint8Array(ab); 

       var binaryImg; 
       for (var i = 0; i < ua.length; i++) { 
        binaryImg += String.fromCharCode(ua[i]); 
       } 
       var img64 = btoa(binaryImg); 

       var image = new Image(); 
       image.src = 'data:image/png;base64,' + img64; 

       var img = document.getElementById('img'); 
       img.src = image.src; 
      } 
      fileReader.readAsArrayBuffer(event.target.files[0]); 
     }; 

    </script> 
</body> 
</html> 
+0

'toDataURL'을 호출 한 후에는 base64 인코딩 이미지가 있어야합니다. 'atob' *으로 다시 인코딩 할 필요는 없습니다. – Pointy

+0

@Pointy 의견이 맞지 않습니다. 이 줄이 없으면 오류가 발생합니다. ** 'atob'failed : 디코딩 할 문자열이 올바르게 인코딩되지 않았습니다. ** – 31415926

+0

* 또는 * 디코드 할 필요가 없습니다. 바이트를 저장 한 다음 코드로 다시 작성하십시오. 하고있다. 그러나, 그것은 아무 것도 해치면 안됩니다. 그것은 단지 필요하지 않습니다. – Pointy

답변

2

귀하의 "로드"핸들러는 event 매개 변수없이 선언됩니다. 따라서 파일 내용에 액세스 할 수 없습니다.

 fileReader.onload = function (event) { 
      var ab = event.target.result; 

해당 매개 변수가 없으면 "이벤트"기호는 둘러싼 함수의 매개 변수를 참조하며 파일 내용은 갖지 않습니다.

또한 캔버스 내용을 데이터 URL로 변환 한 결과가 base64 문자열이되므로 atobbtoa을 통해 base64 인코딩/디코딩을 수행 할 필요가 없습니다.

+0

이벤트 매개 변수를 추가했지만 이미지를로드하지 않으므로 여기서 유일한 문제는 아닌 것 같습니다. atob 및 btoa없이 사용하는 방법을 보여줄 수 있습니까? – 31415926

+0

@Qvatra 잘'atob' /'btoa' 것은 * 문제가 될 수도 있지만 가장 먼저 할 일은 파일 판독기에서 아무것도 얻지 못하게하는 것입니다. 'console.log()'호출을하거나, 디버거를 사용하고 중단 점을 설정하려고 했습니까? 이미지 데이터를 올바르게 복원하고 있는지 여부를 알 수 있습니까? – Pointy

관련 문제