base64를 javascript / jquery의 이미지로 변환


92

javascript / jquery를 사용하여 이미지 캡처를위한 코드를 작성했습니다. 아래 코드는 다음과 같습니다.

function capture_image(){ 
    alert("capture_image");
    var p = webcam.capture();
    webcam.save();           
    alert("capture complete "+p); //getting true here


     var img = canvas.toDataURL("image");
    var item_image = img.replace(/^data:image\/(png|jpg);base64,/, "") ; 
    alert("item_image"+item_image);
}

item_image는 base64 형식, base64를 이미지로 변환하는 방법 및 자바 스크립트 클라이언트 측에서 해당 경로를 사용하는 방법을 인쇄합니다.

Google에서 너무 많은 웹 사이트를 검색하고 있지만 작동하지 않으며 해당 코드가 내 요구 사항에 적합하지 않습니다.


base64 데이터를 이미지로 원하면 서버 측에서 문자열을 처리하고 서버 측에 저장된 이미지의 경로를 사용해야합니다. Ajax Post 메소드를 사용하여이를 수행 할 수 있습니다.
Rayon 2014 년

이전 게시물을 부활하기 위해, 여기 좀 봐 : stackoverflow.com/a/19644105를
누가 복음 Madhanga에게

답변:


131

다음 과 같은 부분을 포함하여 Image객체를 만들고 base64를 .srcdata:image...

var image = new Image();
image.src = 'data:image/png;base64,iVBORw0K...';
document.body.appendChild(image);

이것이 그들이 "데이터 URI"라고 부르는 것이고 여기 에 내적 평화를위한 호환성 표 가 있습니다.


1
u는 명확하게 설명 이미지를 반환 객체의 HTML 요소를 의미하는 방법을 이미지로 읽을 수
user2996174

여기에 img 태그 <img id = "myImg"src = "d : \\ face.png"border = 1>를 쓰고이 코드를 사용하고 있습니다. document.getElementById ( 'myImg'). src = item_image; // <img tag >하지만 작동하지 않습니다
user2996174

코드 data:image...item_image.
Joseph

8
OP와 똑같은 것을 찾고 있다고 생각합니다. 나는 그가 이미지 URL이 원래 base64 인코딩 문자열이 아닌 .png를 가리 키기를 원한다고 생각합니다. 가능한 경우 어딘가에서 변환을 찾고 있습니다.
John

1
@John 데이터 URI에는 파일이 원래 어디에서 왔는지에 대한 참조가 없기 때문에 파일을 어딘가에 저장, 업로드 및 호스팅해야합니다.
Gabe O'Leary

18

이것은 OP의 시나리오가 아니라 일부 댓글 작성자의 답변입니다. Cordova 및 Angular 1을 기반으로하는 솔루션으로 jQuery와 같은 다른 프레임 워크에 적용 할 수 있어야합니다. 어딘가에 저장하고 클라이언트 측 javascript / html에서 참조 할 수있는 Base64 데이터의 Blob을 제공합니다.

또한 Base 64 데이터에서 이미지 (파일)를 가져 오는 방법에 대한 원래 질문에 대답합니다.

중요한 부분은 Base 64-이진 변환입니다.

function base64toBlob(base64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 1024;
    var byteCharacters = atob(base64Data);
    var bytesLength = byteCharacters.length;
    var slicesCount = Math.ceil(bytesLength / sliceSize);
    var byteArrays = new Array(slicesCount);

    for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
        var begin = sliceIndex * sliceSize;
        var end = Math.min(begin + sliceSize, bytesLength);

        var bytes = new Array(end - begin);
        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
            bytes[i] = byteCharacters[offset].charCodeAt(0);
        }
        byteArrays[sliceIndex] = new Uint8Array(bytes);
    }
    return new Blob(byteArrays, { type: contentType });
}

메모리 부족 오류를 방지하려면 슬라이싱이 필요합니다.

jpg 및 pdf 파일로 작동합니다 (적어도 내가 테스트 한 것입니다). 다른 mimetypes / contenttypes에서도 작동해야합니다. 목표로하는 브라우저와 버전을 확인하세요. Uint8Array, Blob 및 atob을 지원해야합니다.

다음은 Cordova / Android를 사용하여 장치의 로컬 저장소에 파일을 쓰는 코드입니다.

...
window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dirEntry) {

                    // Setup filename and assume a jpg file
                    var filename = attachment.id + "-" + (attachment.fileName ? attachment.fileName : 'image') + "." + (attachment.fileType ? attachment.fileType : "jpg");
                    dirEntry.getFile(filename, { create: true, exclusive: false }, function(fileEntry) {
                        // attachment.document holds the base 64 data at this moment
                        var binary = base64toBlob(attachment.document, attachment.mimetype);
                        writeFile(fileEntry, binary).then(function() {
                            // Store file url for later reference, base 64 data is no longer required
                            attachment.document = fileEntry.nativeURL;

                        }, function(error) {
                            WL.Logger.error("Error writing local file: " + error);
                            reject(error.code);
                        });

                    }, function(errorCreateFile) {
                        WL.Logger.error("Error creating local file: " + JSON.stringify(errorCreateFile));
                        reject(errorCreateFile.code);
                    });

                }, function(errorCreateFS) {
                    WL.Logger.error("Error getting filesystem: " + errorCreateFS);
                    reject(errorCreateFS.code);
                });
...

파일 자체 작성 :

function writeFile(fileEntry, dataObj) {
    return $q(function(resolve, reject) {
        // Create a FileWriter object for our FileEntry (log.txt).
        fileEntry.createWriter(function(fileWriter) {

            fileWriter.onwriteend = function() {
                WL.Logger.debug(LOG_PREFIX + "Successful file write...");
                resolve();
            };

            fileWriter.onerror = function(e) {
                WL.Logger.error(LOG_PREFIX + "Failed file write: " + e.toString());
                reject(e);
            };

            // If data object is not passed in,
            // create a new Blob instead.
            if (!dataObj) {
                dataObj = new Blob(['missing data'], { type: 'text/plain' });
            }

            fileWriter.write(dataObj);
        });
    })
}

최신 Cordova (6.5.0) 및 플러그인 버전을 사용하고 있습니다.

여기에있는 모든 사람들이 올바른 방향으로 나아가기를 바랍니다.


12

@Joseph의 답변에 따라 이것을 추가해야합니다. 누군가 이미지 개체를 만들고 싶다면 :

var image = new Image();
image.onload = function(){
   console.log(image.width); // image is loaded and we have image width 
}
image.src = 'data:image/png;base64,iVBORw0K...';
document.body.appendChild(image);

1
좋은 전화. console.log(image.width);src 설정 후 직접 수행하면 Chrome의 첫 번째로드에서 0을 얻지 만 후속 페이지를 다시로드하면 이미지의 실제 너비를 얻습니다. 브라우저가 이미지를 캐싱하는 것처럼 보이지만, 기술적으로 src를 비동기식으로 설정하기 때문에 첫 번째로드를 수신해야합니다. 즉, src를 base64 문자열로 설정 한 직후 이미지를 갖는 것에 의존 할 수 없음을 의미합니다. 코드는 제대로로드되었는지 확인하지 않는 한 빈 이미지와 함께 동기식으로 계속 실행됩니다.
Frank

11
var src = "data:image/jpeg;base64,";
src += item_image;
var newImage = document.createElement('img');
newImage.src = src;
newImage.width = newImage.height = "80";
document.querySelector('#imageContainer').innerHTML = newImage.outerHTML;//where to insert your image

1
이것은 실제로 효과가 있었던 유일한 대답입니다 !!!! 이제 이것을 AJAX 요청으로 보내는 방법은 무엇입니까?
Raz

11

HTML

<img id="imgElem"></img>

Js

string baseStr64="/9j/4AAQSkZJRgABAQE...";
imgElem.setAttribute('src', "data:image/jpg;base64," + baseStr64);

0

빠르고 쉬운 방법 :

function paintSvgToCanvas(uSvg, uCanvas) {

    var pbx = document.createElement('img');

    pbx.style.width  = uSvg.style.width;
    pbx.style.height = uSvg.style.height;

    pbx.src = 'data:image/svg+xml;base64,' + window.btoa(uSvg.outerHTML);
    uCanvas.getContext('2d').drawImage(pbx, 0, 0);

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