2017-04-26 9 views
1

別のイメージから切り取ったbase64イメージからファイルオブジェクトを作成しようとしています。私はそれを行うことができますが、結果のファイルサイズは実際のサイズのほぼ3倍です。私が使用している機能は以下の通りです。JavaScriptのbase64イメージをファイルオブジェクトに変換する

convertDataURItoFile(dataURI, fileName) { 
    // convert base64 to raw binary data held in a string 
    // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this 
    var byteString = atob(dataURI.split(',')[1]); 

    // separate out the mime component 
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] 

    // write the bytes of the string to an ArrayBuffer 
    var ab = new ArrayBuffer(byteString.length); 

    var ia = new Uint8Array(ab); 
    for (var i = 0; i < byteString.length; i++) { 
     ia[i] = byteString.charCodeAt(i); 
    } 
    // write the ArrayBuffer to a blob, and you're done 
    var blob: any = new Blob([ia], { type: mimeString }); 

    //A Blob() is almost a File() - it's just missing the two properties below which we will add 
    blob.lastModifiedDate = new Date(); 
    blob.name = fileName; 
    //Cast to a File() type 
    return <File>blob; 
    } 

ファイルサイズが非常に大きくなる理由は何ですか?どうすれば圧縮できますか?前もって感謝します。

+0

で@Endlessによって回答を参照してください、data URIBlob表現を作成し、取得するためにfetch()を利用することができます_結果の 'Blob'のサイズが違うとあなたはどのように判断しましたか? '.name'と' .lastModifiedDate'を設定したいのであれば、なぜ 'File'コンストラクタを使わないのですか? 'File'は' Blob'から継承し、 'Blob'は' File'から継承しません。 – guest271314

+0

渡された 'data URI'の内容よりも大きい' .size'を持つ結果のBlobを再現できません。注意すべき点は、結果として得られる 'Blob'は' data URI'と同じデータ内容ではありません。 \t _ "結果のファイルサイズは実際のサイズのほぼ3倍です" _を示すにはstacksnippetsまたはplnkr https://plnkr.coを作成できますか? https://stackoverflow.com/help/mvceを参照してください。 – guest271314

答えて

3

別のイメージから切り取ったbase64イメージからファイルオブジェクトを作成しようとしています。 私はそれを行うことができますが、結果のファイルサイズは 実際のサイズのほぼ3倍です。

は、入力data URIのコンテンツのサイズの3倍であることBlob.sizeを結果として再現することはできません。 .lengthは、Blob.sizeの3倍のサイズになりますか?

function convertDataURItoFile(dataURI, fileName) { 
 
    // convert base64 to raw binary data held in a string 
 
    // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this 
 
    var byteString = atob(dataURI.split(',')[1]); 
 

 
    // separate out the mime component 
 
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] 
 
    // write the bytes of the string to an ArrayBuffer 
 
    var ab = new ArrayBuffer(byteString.length); 
 

 
    var ia = new Uint8Array(ab); 
 
    for (var i = 0; i < byteString.length; i++) { 
 
     ia[i] = byteString.charCodeAt(i); 
 
    } 
 
    // write the ArrayBuffer to a blob, and you're done 
 
    var blob = new Blob([ia], { type: mimeString }); 
 

 
    //A Blob() is almost a File() - it's just missing the two properties below which we will add 
 
    blob.lastModifiedDate = new Date(); 
 
    blob.name = fileName; 
 
    //Cast to a File() type 
 
    console.log(`input data size: ${datauriLength} Blob.size: ${blob.size}`); 
 
    return blob; 
 
    } 
 
    
 
const [datauri, filename] = ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASoAAADCCAYAAAD+Wo90AAAABHNCSVQICAgIfAhkiAAAApVJREFUeJzt1DEBACAMwLCBf88ggZMeiYJeXTPnDEDY/h0A8GJUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkHcBRH8DgsmlTc8AAAAASUVORK5CYII=", "filename.png"]; 
 

 
const datauriLength = datauri.length; 
 

 
const reader = new FileReader; 
 
reader.onload =() => { 
 
    console.log(`data URI: ${reader.result}`) 
 
    document.querySelector("iframe").src = reader.result; 
 
}; 
 

 
reader.readAsDataURL(convertDataURItoFile(datauri, filename));
<iframe></iframe>

Blobに追加する必要があり.name.lastModifiedDate場合は、ファイル名パラメータはFileコンストラクタの2番目のパラメータに設定されることを想定している、BlobためFileコンストラクタを使用して置き換え、必要に応じてすることができます予想される.lastModidiedおよび/または.lastModifiedDateコンストラクタの3番目のパラメータのパラメータ。

function convertDataURItoFile(dataURI, fileName) { 
 
    // convert base64 to raw binary data held in a string 
 
    // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this 
 
    var byteString = atob(dataURI.split(',')[1]); 
 

 
    // separate out the mime component 
 
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0] 
 
    // write the bytes of the string to an ArrayBuffer 
 
    var ab = new ArrayBuffer(byteString.length); 
 

 
    var ia = new Uint8Array(ab); 
 
    for (var i = 0; i < byteString.length; i++) { 
 
     ia[i] = byteString.charCodeAt(i); 
 
    } 
 
    // write the ArrayBuffer to a blob, and you're done 
 
    // use `File` constructor here 
 
    var blob = new File([ia], fileName, { type: mimeString, lastModifiedDate: new Date() }); 
 

 
    //A Blob() is almost a File() - it's just missing the two properties below which we will add 
 
    // blob.lastModifiedDate = new Date(); 
 
    // blob.name = fileName; 
 
    //Cast to a File() type 
 
    console.log(`input data size: ${datauriLength} Blob.size: ${blob.size}`); 
 
    return blob; 
 
    } 
 
    
 
const [datauri, filename] = ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASoAAADCCAYAAAD+Wo90AAAABHNCSVQICAgIfAhkiAAAApVJREFUeJzt1DEBACAMwLCBf88ggZMeiYJeXTPnDEDY/h0A8GJUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkGdUQJ5RAXlGBeQZFZBnVECeUQF5RgXkGRWQZ1RAnlEBeUYF5BkVkHcBRH8DgsmlTc8AAAAASUVORK5CYII=", "filename.png"]; 
 

 
const datauriLength = datauri.length; 
 

 
const reader = new FileReader; 
 
reader.onload =() => { 
 
    console.log(`data URI: ${reader.result}`) 
 
    document.querySelector("iframe").src = reader.result; 
 
}; 
 

 
reader.readAsDataURL(convertDataURItoFile(datauri, filename));
<iframe></iframe>

また、「結果のファイルサイズは、ほぼ実際のサイズの3倍である」_ Creating a Blob from a base64 string in JavaScript

関連する問題