javascript / jqueryでbase64を画像に変換します


90

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を画像に変換する方法、およびjavascriptクライアント側でそのパスを使用する方法を出力します。

グーグルで非常に多くのウェブサイトを検索していますが、機能しておらず、そのコードは私の要件に適していません。


そのbase64データを画像として使用する場合は、サーバー側で文字列を処理し、サーバー側で保存された画像のパスを使用する必要があります。これは、AjaxPostメソッドを使用して行うことができます。
レーヨン

古い投稿を復活させるには、こちらをご覧ください:stackoverflow.com/a/19644105
Luke Madhanga 2014

回答:


128

次のような部分を含め、Imageオブジェクトを作成してbase64をそのオブジェクトとして配置するだけです。srcdata:image...

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

それは彼らが「データURI」と呼んでいるものであり、これが内なる平和のための互換性テーブルです。


1
画像がオブジェクトのhtml要素を返すことと画像として読み取る方法を明確に説明できますか
user2996174 2014年

ここでは、imgタグ<img id = "myImg" src = "d:\\ face.png" border = 1>を記述しており、これらのコードを使用していますdocument.getElementById( 'myImg')。src = item_image; // <img tag >しかし、機能していません
user2996174 2014年

これは、コードがdata:image...からパーツを削除したためitem_imageです。
ジョセフ

8
OPと同じものを探していると思います。彼は、画像のURLが、元のbase64でエンコードされた文字列ではなく.pngを指すようにしたいと考えています。可能であれば、どこかで変換を探します。
ジョン

1
@JohnデータURIにはファイルの元の場所への参照がないため、ファイルをどこかに保存、アップロード、およびホストする必要があります。
Gabe O'Leary 2016年

18

これは正確にはOPのシナリオではありませんが、一部のコメント提供者のシナリオに対する回答です。これは、CordovaとAngular 1に基づくソリューションであり、jQueryなどの他のフレームワークに適応できるはずです。Base64データからBlobを提供し、どこかに保存して、クライアント側のjavascript / htmlから参照できます。

また、Base 64データから画像(ファイル)を取得する方法に関する元の質問にも答えます。

重要な部分はBase64-バイナリ変換です。

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文字列に設定した直後に画像があることに依存することはできません。コードが正しくロードされていることを確認しない限り、コードは空のイメージと同期した順序で実行され続けます。
フランク

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 2018

9

HTML

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

Js

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

0

すばやく簡単な方法の1つ:

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.