blog

画像フォーマットの相互変換 - フロントエンド

... さらに......

Mar 5, 2020 · 2 min. read
Share this

canvas でイメージを描画するなど、イメージ形式に変換するフロントエンドのシナリオは数多くあります:

  • ウェブイメージを指定してください: url -> base64。
  • インターフェイスは、Blob または File ファイルストリームであることが期待されます: Base64 -> Blob -> File;。
  • more...

I. url-> base64

export function getDataUri(url) {
 return new Promise((resolve, reject) => {
 let image = new Image();
 // CORS ポリシー、クロスドメインの問題がある https://.///--or
 image.setAttribute('crossOrigin', 'anonymous'); // イメージへのクロスドメインアクセスを許可する
 image.crossOrigin = 'Anonymous';
 
 image.src = url;
 image.onload = function () {
 let canvas = document.createElement('canvas'),
 width = image.width, // canvasファイルのサイズはイメージと同じである。
 height = image.height;
 canvas.width = width;
 canvas.height = height;
 canvas.getContext('2d').drawImage(this, 0, 0, width, height);
 // Data URI
 resolve(canvas.toDataURL('image/png'));
 };
 // console.log(image.src);
 image.onerror = () => {
 reject(new Error('イメージストリーム例外'));
 };
 });
}

Base64 -> ファイル> Blob -> File

/**
 * @return Promise base64 ブロブに変換する
 * @param {String} b64data base64
 * @param {String} name イメージ名
 * @param {String} type イメージタイプ デフォルト: image/jpeg, image/png...
 */
export function base64ToBlob(dataURL, name, type = 'image/jpeg', sliceSize = 512) {
 const base64 = dataURL.split(',')[1];
 return new Promise((resolve, reject) => {
 // atob()メソッドを使用してデータをデコードする。
 let byteCharacters = window.atob(base64);
 let byteArrays = [];
 for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
 let slice = byteCharacters.slice(offset, offset + sliceSize);
 let byteNumbers = [];
 for (let i = 0; i < slice.length; i++) {
 byteNumbers.push(slice.charCodeAt(i));
 }
 // 8 ビット単位の符号なし整数値の型付き配列。内容は0に初期化される。
 // 要求されたバイト数が割り当てられない場合、例外がスローされる。
 byteArrays.push(new Uint8Array(byteNumbers));
 }
 let result = new Blob(byteArrays, {
 type: type,
 name,
 });
 result = Object.assign(result, {
 lastModified: new Date().getTime(),
 lastModifiedDate: new Date(),
 name: name,
 webkitRelativePath: '',
 // URLを使う.createObjectURL() Blobオブジェクト用の一時URLを作成する
 preview: URL.createObjectURL(result), 
 });
 // Blob -> File
 const newFile = new File([result], result.name, {type: result.type})
 resolve(newFile);
 });
}

Blob -> ファイル> Base64

export function blobToBase64(blob) {
 return new Promise((resolve, reject) => {
 const fileReader = new FileReader();
 fileReader.onload = (e) => {
 resolve(e.target.result);
 };
 // readAsDataURL
 fileReader.readAsDataURL(blob);
 fileReader.onerror = () => {
 reject(new Error('ファイルストリーム例外'));
 };
 });
}
Read next

人工知能2020後半戦、準備はいいか?

記事の出典 人工知能は、寒い冬を信じてはいけない 過去10年間で、世界の人工知能と生活の各界が統合され続け、生産性と効率が大幅に改善され、さらに企業の80%が明確に2020年に人工知能への投資を増やすために、商業化の見通しは広く楽観的であると述べました。しかし、今年の大流行

Mar 5, 2020 · 4 min read