blog

キャンバス、画像、ブロブ、base64データ変換の一連のプレイコーディングを見る

jpeg画像で遊んでください、pngは変換後のオリジナルより大きく表示されます。...

Jul 24, 2020 · 3 min. read
Share this

コードに直行。

<!DOCTYPE html>
<html lang="en">
 <head>
 <meta charset="UTF-8" />
 <meta
 name="viewport"
 content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,user-scalable=no"
 />
 <title>data_transform</title>
 <script>
 const appendChild = (ele = document.createElement("div"), title = "") => {
 const div = document.createElement("div");
 title && (div.innerHTML = `<div>${title}</div>`);
 div.appendChild(ele);
 return div;
 };
 const downloadAction = (
 data_url = "",
 file_name = "file_name",
 file_ext = "jpeg"
 ) => {
 const a = document.createElement("a");
 a.textContent = "Download";
 a.download = `${file_name}.${file_ext}`;
 a.href = data_url;
 a.click();
 };
 const DataTransform = {
 file2DataUrl: (file, is_blob_url = false) =>
 new Promise((res, rej) => {
 if (is_blob_url === true) {
 res(window.URL.createObjectURL(file));
 } else {
 const reader = new FileReader();
 reader.onload = () => {
 res(reader.result, reader);
 };
 reader.onerror = rej;
 reader.readAsDataURL(file);
 }
 }),
 url2Image: (url = "") =>
 new Promise((res, rej) => {
 const image = new Image();
 image.src = url;
 image.onload = () => res(image);
 image.onerror = rej;
 }),
 image2Canvas: (
 image = document.createElement("img"),
 { width, height, position: { top = 0, left = 0 } = {} } = {}
 ) => {
 const canvas = document.createElement("canvas");
 const ctx = canvas.getContext("2d");
 canvas.width = width 
 image.naturalWidth;
 canvas.height = height 
 image.naturalHeight;
 ctx.drawImage(image, top, left, canvas.width, canvas.height);
 return Promise.resolve(canvas);
 },
 canvas2DataUrl: (
 canvas = document.createElement("canvas"),
 {
 mime_type = "image/jpeg",
 quality = undefined,
 is_blob = false
 } = {}
 ) =>
 new Promise(res => {
 if (is_blob) {
 canvas.toBlob(blob => res(blob), mime_type, quality);
 } else {
 res(canvas.toDataURL(mime_type, quality));
 }
 }),
 dataUrl2Blob: (data_url = "", mime_type = "") => {
 const [data_type, data] = data_url.split(",");
 const [, mime] = data_type.match(/^data:(.*?);(base64?)/);
 const bin_str = atob(data);
 const arr = new Uint8Array(data.length).map((v, k) =>
 bin_str.charCodeAt(k)
 );
 return Promise.resolve(new Blob([arr], { type: mime_type 
 mime }));
 }
 };
 function inputOnChange({ files }) {
 DataTransform.file2DataUrl(files[0])
 // .then(data_url => {
 // alert("オリジナルイメージをダウンロードする");
 // downloadAction(data_url);
 // return data_url;
 // })
 .then(DataTransform.url2Image)
 .then(DataTransform.image2Canvas)
 .then(DataTransform.canvas2DataUrl)
 // .then(data_url => {
 // alert("canvas2DataUrlイメージをダウンロードする");
 // downloadAction(data_url);
 // return data_url;
 // })
 .then(DataTransform.dataUrl2Blob)
 .then(DataTransform.file2DataUrl)
 // .then(data_url => {
 // alert("file2DataUrl Diagramをダウンロードする");
 // downloadAction(data_url);
 // return data_url;
 // })
 .then(DataTransform.url2Image)
 .then(image => {
 document.body.append(appendChild(image, "1 image"));
 return image;
 })
 .catch(console.error);
 }
 </script>
 </head>
 <body>
 <input type="file" onchange="inputOnChange(this)" />
 </body>
</html>

再生にはjpegイメージを使用してください。pngは変換後にオリジナルより大きく表示されます。

Read next

No articles found.

No articles found.