質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2013閲覧

JavascriptでJPEGをPNGにしたい

kokawa2003

総合スコア217

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/11/09 06:52

編集2018/11/09 06:55

javascriptでhttp://hogehoge.Jpgのuint8arrayをpngに変換する必要に迫られまして、下記コードを書きました。

javascript

1 2 function loadImg(imgUrl) { 3 var xhr = new XMLHttpRequest(); 4 xhr.open('GET', imgUrl, true); 5 xhr.responseType = "arraybuffer"; 6 xhr.onload = function() { 7 var bytes = new Uint8Array(this.response); 8 console.log("uint8jpg:"+bytes); 9 var blob = new Blob([ bytes ], { type: "image/jpeg" }); 10 console.log('blob:'+blob); 11 window.createImageBitmap(blob) 12 .then(function(image) { 13 var width = image.width; 14 var height = image.height; 15 console.log('ok'+image); 16 var canvas = document.createElement('canvas'); 17 canvas.width = width; 18 canvas.height = height; 19 20 // Draw Image 21 var ctx = canvas.getContext('2d'); 22 ctx.drawImage(image, 0, 0); 23 var pngdata=canvas.toDataURL("image/png"); 24 console.log('w,h:'+width+','+height); 25 var BASE64_MARKER = ';base64,'; 26 var base64Index = pngdata.indexOf(BASE64_MARKER) + BASE64_MARKER.length; 27 var base64 = pngdata.substring(base64Index); 28 var raw = window.atob(base64); 29 var rawLength = raw.length; 30 var array = new Uint8Array(new ArrayBuffer(rawLength)); 31 for(i = 0; i < rawLength; i++) { 32 array[i] = raw.charCodeAt(i); 33 } 34 hogehoge...... 35 }) 36 37 }; 38 xhr.send(); 39 };

このコードなのですがfirefox,chromeでは動くがsaferiではだめだった。
理由を調べるとwindow.createImageBitmap(blob)でundefinedで落ちてた。
でさらに調べると
ImageBitmapがsafariではつかえないらしい。
https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap
ということは多分サファリでは他の関数で代用できるとおもわれますが
どうするのが正解か分かる人はいませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Lhankor_Mhyさんのコメントで紹介されているpolyfillが実際にやっているとおりではあるのですが、一度<img>要素に画像を読み込めばcreateImageBitmapを使わずに済むと思います。

js

1function loadImg(imgUrl) { 2 var xhr = new XMLHttpRequest(); 3 xhr.open('GET', imgUrl, true); 4 xhr.responseType = "arraybuffer"; 5 xhr.onload = function() { 6 var bytes = new Uint8Array(this.response); 7 console.log("uint8jpg:"+bytes); 8 var blob = new Blob([ bytes ], { type: "image/jpeg" }); 9 console.log('blob:'+blob); 10 11 var objUrl, img = new Image(); // 変更箇所 12 img.onload = function(image) { // 変更箇所 13 14 var width = image.width; 15 var height = image.height; 16 console.log('ok'+image); 17 var canvas = document.createElement('canvas'); 18 canvas.width = width; 19 canvas.height = height; 20 21 // Draw Image 22 var ctx = canvas.getContext('2d'); 23 ctx.drawImage(image, 0, 0); 24 URL.revokeObjectURL(objUrl); // 変更箇所; 使い終わったobjUrlを破棄 25 26 // 中略 27 28 }); 29 30 objUrl = URL.createObjectURL(blob); // 変更箇所 31 img.src = objUrl; 32 33 }; 34 xhr.send(); 35};

createImageBitmapに比べると、オブジェクトURLを作ったり破棄したりする必要があるのがデメリットでしょうか。

投稿2018/11/09 09:28

othersight

総合スコア356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2018/11/09 10:59

オブジェクトURLなるものを初めて知りました。MACな人が明日くるので来たら確認します
kokawa2003

2018/11/29 03:52

今時なにって感じですが。上記コードは実は今確認したがだめだったのでなおした。 function loadImg2(imgUrl){ var xhr = new XMLHttpRequest(); xhr.open('GET', imgUrl, true); xhr.responseType = "arraybuffer"; xhr.onload = function() { var bytes = new Uint8Array(this.response); console.log("uint8jpg:"+bytes); var blob = new Blob([ bytes ], { type: "image/jpeg" }); console.log('blob:'+blob); var objUrl; var img = new Image(); img.onload = function() { // 変更箇所 var image=img; try{ var width = image.width; var height = image.height; console.log('ok'+image); var canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; // Draw Image var ctx = canvas.getContext('2d'); ctx.drawImage(image, 0, 0); URL.revokeObjectURL(objUrl); // 変更箇所; 使い終わったobjUrlを破棄 var pngdata=canvas.toDataURL("image/png"); console.log('png'+pngdata); console.log('w,h:'+width+','+height); var BASE64_MARKER = ';base64,'; var base64Index = pngdata.indexOf(BASE64_MARKER) + BASE64_MARKER.length; var base64 = pngdata.substring(base64Index); var raw = window.atob(base64); var rawLength = raw.length; var array = new Uint8Array(new ArrayBuffer(rawLength)); for(i = 0; i < rawLength; i++) { array[i] = raw.charCodeAt(i); } console.log("uint8png:"+array); hogehoge }catch(e){ hogehoge } }; objUrl = URL.createObjectURL(blob); // 変更箇所 img.src = objUrl; }; xhr.send(); }
othersight

2018/12/04 03:06

雑な対応になってしまい、失礼しました。とはいえ、解決したのであれば幸いです。
guest

0

「createimagebitmap polyfill」でググったところ、こんな記事が。
createImageBitmap polyfill for Safari and Edge - DEV Community ????‍????????‍????

投稿2018/11/09 07:25

Lhankor_Mhy

総合スコア36074

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問