JavaScript를 사용하여 Blob 표시


88

데이터베이스에서 Blob 이미지를 검색 중이며 JavaScript를 사용하여 해당 이미지를보고 싶습니다. 다음 코드는 페이지에 깨진 이미지 아이콘을 생성합니다.

var image = document.createElement('image');
    image.src = 'data:image/bmp;base64,'+Base64.encode(blob);
    document.body.appendChild(image);

다음은 blob을 포함하여 필요한 모든 코드를 포함 하는 jsFiddle 입니다. 완성 된 코드는 이미지를 제대로 표시해야합니다.


Blob의 형식은 무엇입니까? 어떤 형식 (jpeg, png, gif 등)의 이미지입니까 아니면 RGB 바이트입니까?
bjornd

4
그것은해야하지 document.createElement('img');대신document.createElement('image');?
파블로 로자노

답변:


114

XMLHttpRequest에서 직접 BLOB 객체를 가져올 수도 있습니다. responseType을 blob으로 설정하면 트릭이됩니다. 내 코드는 다음과 같습니다.

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost/image.jpg");
xhr.responseType = "blob";
xhr.onload = response;
xhr.send();

그리고 응답 함수는 다음과 같습니다.

function response(e) {
   var urlCreator = window.URL || window.webkitURL;
   var imageUrl = urlCreator.createObjectURL(this.response);
   document.querySelector("#image").src = imageUrl;
}

HTML에서 빈 이미지 요소를 만들기 만하면됩니다.

<img id="image"/>

22
중요한 줄은 urlCreator.createObjectURL(blob)이미지 src에 할당 할 수있는 imageUrl을 반환하는 것입니다.
Agent47DarkSoul

7
호출을 완료하면 생성 된 URL을 취소하는 것을 잊지 마십시오. revokeObjectURL
Ralpharoo 2018

나는 OP의 이미지가 db 의 어떤 종류의 필드 있다고 가정합니다. 즉, OP는 그것을 직접 얻을 수 없습니다 . 그가 그렇게 할 수 있다면, 그는 XHR / fetch를하는 대신 직접img -태그를 사용할 것입니다. 둘 다 SOP에 취약하기 때문입니다.
Christian Ulbrich

75

대신 가져 오기를 사용하려는 경우 :

var myImage = document.querySelector('img');

fetch('flowers.jpg').then(function(response) {
  return response.blob();
}).then(function(myBlob) {
  var objectURL = URL.createObjectURL(myBlob);
  myImage.src = objectURL;
});

출처:

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch


이미지가 base64로 인코딩되면 자동으로 base64를 변환합니까?
P Satish Patro

2
나는 당신을 사랑합니다. 나는 이것을 발견 할 때까지 해결하려고 4 시간을 보냈다.
tinyCoder

무슨 일이 일어나는가if (typeof URL !== "function") {}
zanderwar

19

문자열을 Uint8Array 로 변환하여 원시 데이터를 가져올 수 있습니다. 그런 다음 해당 데이터에 대한 Blob 을 만들고 URL.createObjectURL (blob) 에 전달 하여 Blob을 img.src에 전달하는 URL로 변환합니다 .

var data = '424D5E070000000000003E00000028000000EF...';

// Convert the string to bytes
var bytes = new Uint8Array(data.length / 2);

for (var i = 0; i < data.length; i += 2) {
    bytes[i / 2] = parseInt(data.substring(i, i + 2), /* base = */ 16);
}

// Make a Blob from the bytes
var blob = new Blob([bytes], {type: 'image/bmp'});

// Use createObjectURL to make a URL for the blob
var image = new Image();
image.src = URL.createObjectURL(blob);
document.body.appendChild(image);

http://jsfiddle.net/nj82y73d/ 에서 전체 예제를 시도 할 수 있습니다.


14

귀하의 예에서는 createElement('img').

링크에서 base64blob != Base64.encode(blob).

데이터가 유효한 한 http://jsfiddle.net/SXFwP/ (BMP 이미지가 없어서 PNG를 사용해야했습니다).


img에 대한 좋은 지적. 'img'는 html 이미지 요소이며, 여기서 'image'는 이미지 유형의 html 입력 요소이지만이 경우에는 차이가 없습니다. 타사 소스에서 가져온 이미지 데이터 유효 하다고 가정합니다 . 어쨌든 이것을 테스트하는 것을 알고 있습니까? 아니면 업로드 된 이미지에서 blob을 제공하는 쉬운 사이트입니까? BMP를 테스트하고 싶습니다
GAgnew 2011 년

바이올린의 "blob"은 실제로 Blob이 아닙니다. base64로 인코딩 된 문자열을 사용했습니다.
elliotwesoff

5

이미지의 인라인 코드에 오류가있는 것 같습니다. 이 시도 :

var image = document.createElement('img');
    
image.src="data:image/gif;base64,R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==";
    
image.width=100;
image.height=100;
image.alt="here should be some image";
    
document.body.appendChild(image);

유용한 링크 : http://dean.edwards.name/my/base64-ie.html


3

문제는 base64로 인코딩되기 전에 바이너리로 변환해야하는 16 진수 데이터가 있다는 것입니다.

PHP에서 :

base64_encode(pack("H*", $subvalue))

0

바이올린에서 Blob은 Blob이 아니라 16 진수 데이터의 문자열 표현입니다. 얼룩에 이것을 시도하고 완료

var image = document.createElement('img');
let reader=new FileReader()
reader.addEventListener('loadend',()=>{
  let contents=reader.result
  image.src = contents
  document.body.appendChild(image);
})
if(blob instanceof Blob) reader.readAsDataURL(blob)

readAsDataURL은 이미지 요소 () 소스 (src)를 위해 준비된 base64 인코딩 이미지를 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.