この記事では、主にカメラを呼び出して写真を圧縮するサンプルコードを紹介します。内容は非常に優れているので、参考として共有します。
ドキュメントを整理して、カメラを呼び出して写真を撮ったり、画像を圧縮したりするためのサンプルコードを見つけました。共有するために少し整理して整理しました。
背景
私は最近h5ページを作成しました。主な機能は、カメラを呼び出して写真を撮るか、アルバムから写真を選択し、写真をbase64に圧縮してからバックエンドサーバーにアップロードすることです。認識結果を返します。
フロントエンドの主な機能ポイントは次のとおりです:
H5でカメラを呼び出す方法
写真を圧縮する方法
写真をbase64に変換する
H5でカメラ/アルバムを呼び出す
カメラを呼び出す最も簡単な方法 入力ファイルの [camera] 属性を使用するだけです:
<input type="file" capture=camera accept="image/*">//相机 <input type="file" accept="image/*">//相册
このメソッドの互換性にはまだ問題がありますが、iPhone ではカメラを正常に開くことができます。 Android スマートフォンをクリックすると、カメラ、ギャラリー、ファイル マネージャー、およびその他の複合オプションが開きます。インターネットでいろいろ調べましたが、良い解決策が見つからず、書き続けるしかありません。 。 。
画像圧縮
画像圧縮が使用されますFileReader
和<canvas>
。
FileReader オブジェクトを使用すると、Web アプリケーションは、File または Blob オブジェクトを使用して、読み取るファイルまたはデータを指定し、コンピューターに保存されているファイルの内容を非同期的に読み取ることができます。
<canvas> は、スクリプトを使用してグラフィックスや簡単なアニメーションを描画できる HTML 要素です。
画像圧縮では、画像の解像度と品質を圧縮する必要があります。解像度圧縮の場合、画像の最大側を 800 に設定し、もう一方の側は画像の元の比率に従って拡大縮小することもできます。画像の拡大縮小率。
var MAX_WH=800; var image=new Image(); image.onload=function () { if(image.height > MAX_WH) { // 宽度等比例缩放 *= image.width *= MAX_WH/ image.height; image.height = MAX_WH; } if(image.width > MAX_WH) { // 宽度等比例缩放 *= image.height *= MAX_WH/ image.width; image.width = MAX_WH; } } image.src=dataURL;//dataURL通过FileReader获取
次に、圧縮画像の品質ですが、ここでの圧縮率は 80% に設定されており、設定が小さすぎると画像が歪みます。 <canvas> タグを動的に作成し、画像を圧縮します。
var quality=80; var cvs = document.createElement('canvas'); cvs.width = image.width; cvs.heigh = image.height; var context=cvs.getContext("2d"); context.drawImage(image, 0, 0,image.width, image.height); dataURL = cvs.toDataURL('image/jpeg', quality/100);
次に、それをサーバーにアップロードし、サーバーの結果を表示します。 。 。 iOS スマートフォンで写真を撮影すると、圧縮された後に写真が不可解に回転します。問題の解決を続けます。
IOS画像回転の解決策
まずexif.jsを引用し、EXIF.getDataとEXIF.getTagを通じて写真の方向情報を取得します。
//file通过input标签获取 EXIF.getData(file,function(){ orientation=EXIF.getTag(file,'Orientation'); });
iPhoneでの写真撮影に対応する各方向の値の意味は次のとおりです:
説明 | |
---|---|
iPhoneの水平画面撮影今回はキーは左側にあり、写真は元の位置に対して180度回転しています | |
このとき、iPhoneはポートレートモードで撮影されています(通常の持ち方向)。携帯電話)、画像は元の位置に対して反時計回りに 90 度回転できます | |
このとき、iPhone は縦画面で撮影されており、画像は次のようになります。元の位置に対して時計回りに90度回転 |
switch (orientation) { case 6: case 8: cvs.width = height; cvs.height = width; break; } var context=cvs.getContext("2d"); switch(orientation){ //iphone横屏拍摄,此时home键在左侧 case 3: // 180度向左旋转 context.translate(width, height); context.rotate(Math.PI); break; //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向) case 6: context.rotate(0.5 * Math.PI); context.translate(0, -height); break; //iphone竖屏拍摄,此时home键在上方 case 8: // 逆时针旋转90度 context.rotate(-0.5 * Math.PI); context.translate(-width, 0); break; }
$('input[type=file]').change(function(e) { var file = this.files[0]; var mime_type=file.type; var orientation=0; if (file && /^image\//i.test(file.type)) { EXIF.getData(file,function(){ orientation=EXIF.getTag(file,'Orientation'); }); var reader = new FileReader(); reader.onloadend = function () { var width,height; var MAX_WH=800; var image=new Image(); image.onload=function () { if(image.height > MAX_WH) { // 宽度等比例缩放 *= image.width *= MAX_WH / image.height; image.height = MAX_WH; } if(image.width > MAX_WH) { // 宽度等比例缩放 *= image.height *= MAX_WH / image.width; image.width = MAX_WH; } //压缩 var quality=80; var cvs = document.createElement('canvas'); cvs.width = width = image.width; cvs.height =height = image.height; switch (orientation) { case 6: case 8: cvs.width = height; cvs.height = width; break; } var context=cvs.getContext("2d"); //解决ios图片旋转问题 switch(orientation){ //iphone横屏拍摄,此时home键在左侧 case 3: // 180度向左旋转 context.translate(width, height); context.rotate(Math.PI); break; //iphone竖屏拍摄,此时home键在下方(正常拿手机的方向) case 6: context.rotate(0.5 * Math.PI); context.translate(0, -height); break; //iphone竖屏拍摄,此时home键在上方 case 8: // 逆时针旋转90度 context.rotate(-0.5 * Math.PI); context.translate(-width, 0); break; } context.drawImage(image, 0, 0,image.width, image.height); dataURL = cvs.toDataURL('image/jpeg', quality/100); //获取识别结果 ... } image.src=dataURL; }; reader.readAsDataURL(file); }else{ alert("只能识别图片!") } });
以上がH5がカメラを呼び出して写真を撮って圧縮するコードについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。