Base64 PNG 데이터를 HTML5 캔버스로


89

Base64로 인코딩 된 PNG 이미지를 캔버스 요소에로드하고 싶습니다. 이 코드가 있습니다.

<html>
<head>
</head>
<body>
<canvas id="c"></canvas>
<script type="text/javascript">

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

data =  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";

ctx.drawImage(data, 0, 0);

</script>
</body>
</html>

Chrome 8에서 오류가 발생합니다. Uncaught TypeError: Type error

그리고 파이어 폭스의 Firebug에서 "객체의 유형이 객체에 연결된 매개 변수의 예상 유형과 호환되지 않습니다"코드 : "17"

그 base64는 내가 김프에서 만든 5x5px 검은 색 PNG 정사각형이며 GNU / Linux의 프로그램 base64에서 base64로 바꿉니다.

답변:


170

보기에 따라 실제로 drawImage에 이미지 객체를 전달해야합니다.

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

var image = new Image();
image.onload = function() {
  ctx.drawImage(image, 0, 0);
};
image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";
<canvas id="c"></canvas>

나는 크롬에서 그것을 시도했고 잘 작동합니다.


8
좋은 대답이지만 이것이 매번 작동한다고 확신합니까? 을 설정 한 직후 이미지를 그리는 것이 버그가 있다는 것을 알았습니다 . 이미지로드가 완료되었는지 확인하기 위해 콜백을 src사용해야하기 때문 onload입니다. 이미지로드가 완료되지 않았기 때문에 내 테스트의 50 %가 실패했습니다.
— Scott Rippey 2012 년

와! 과거에서 폭발 :). 당신 말이 맞습니다. 이미지의 src를 설정 한 직후에 drawImage를 호출하는 경우 문제가 발생할 수 있으며 상황에 따라 렌더링을 시도하기 전에 이미지가 실제로로드되었는지 확인하기 위해 onload를 사용하는 것이 가장 좋습니다. 캔버스에. 위의 코드는 drawImage에 실제로 이미지 객체가 필요하다는 것과이를 전달하는 방법을 보여주는 예제에 불과했습니다.
— Jerryf 2012 년

8
참고로 여러 캔버스를 반복하는 ctx.drawImage(this,0,0);경우 이미지 변수가 올바른 이미지를 참조하도록이를 로 변경할 수 있습니다 . 그래도 좋은 대답!
— Dormouse

13
onload 이벤트는 src 전에 설정해야합니다. 때로는 SRC 즉시로드와 온로드 이벤트 발광하지 않을 수 있습니다
— Totty.js

3
하지만, data:image/길이가 큰 우리가 얻을 것이다414 (Request-URI Too Long
— Sarath

17

Jerryf의 대답은 하나의 결함을 제외하고는 괜찮습니다.

onload 이벤트는 src 전에 설정해야합니다. 때로는 src가 즉시로드되고 onload 이벤트를 발생시키지 않을 수 있습니다.

(Totty.js가 지적한 것처럼.)

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

var image = new Image();
image.onload = function() {
    ctx.drawImage(image, 0, 0);
};
image.src = "data:image/  png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";

2
Btw : Jerryf의 답변을 편집했지만 누군가 거부했습니다. Jerryf가 2014 년에 마지막으로 로그인했다는 프로필에 따르면 Jerryf 일 수는 없습니다.
— John

2
"때로는 src를 즉시로드 할 수 있으며 onload 이벤트를 발생시키지 않습니다." 나는 이런 일이 거의 발생하지 않는 극히 드물다고 생각하지만, onload전에 설정하는 습관을 만들지 않을 이유가 없다 src. 나는 그렇게하는 것을 습관으로 만든다.
— markE

2
@markE 드물지 않습니다. 예를 들어 브라우저를 다시로드 할 때 브라우저가 이미지를 캐시 할 때 항상 발생합니다. 이것은 C ++ 프로그램의 IE 엔진에서 발생했습니다.
— Stefan Rein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.