ホームページ >ウェブフロントエンド >H5 チュートリアル >H5がカメラを呼び出して写真を撮って圧縮するコードについて

H5がカメラを呼び出して写真を撮って圧縮するコードについて

不言
不言オリジナル
2018-06-11 16:38:512216ブラウズ

この記事では、主にカメラを呼び出して写真を圧縮するサンプルコードを紹介します。内容は非常に優れているので、参考として共有します。

ドキュメントを整理して、カメラを呼び出して写真を撮ったり、画像を圧縮したりするためのサンプルコードを見つけました。共有するために少し整理して整理しました。

背景

私は最近h5ページを作成しました。主な機能は、カメラを呼び出して写真を撮るか、アルバムから写真を選択し、写真をbase64に圧縮してからバックエンドサーバーにアップロードすることです。認識結果を返します。

フロントエンドの主な機能ポイントは次のとおりです:

  1. H5でカメラを呼び出す方法

  2. 写真を圧縮する方法

  3. 写真をbase64に変換する

H5でカメラ/アルバムを呼び出す

カメラを呼び出す最も簡単な方法 入力ファイルの [camera] 属性を使用するだけです:

<input type="file" capture=camera accept="image/*">//相机
<input type="file" accept="image/*">//相册

このメソッドの互換性にはまだ問題がありますが、iPhone ではカメラを正常に開くことができます。 Android スマートフォンをクリックすると、カメラ、ギャラリー、ファイル マネージャー、およびその他の複合オプションが開きます。インターネットでいろいろ調べましたが、良い解決策が見つからず、書き続けるしかありません。 。 。

画像圧縮

画像圧縮が使用されますFileReader5ba626b379994d53f7acf72a64f9b697

FileReader オブジェクトを使用すると、Web アプリケーションは、File または Blob オブジェクトを使用して、読み取るファイルまたはデータを指定し、コンピューターに保存されているファイルの内容を非同期的に読み取ることができます。

5ba626b379994d53f7acf72a64f9b697 は、スクリプトを使用してグラフィックスや簡単なアニメーションを描画できる 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% に設定されており、設定が小さすぎると画像が歪みます。 5ba626b379994d53f7acf72a64f9b697 タグを動的に作成し、画像を圧縮します。

var quality=80;
var cvs = document.createElement(&#39;canvas&#39;);
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(&#39;image/jpeg&#39;, quality/100);

次に、それをサーバーにアップロードし、サーバーの結果を表示します。 。 。 iOS スマートフォンで写真を撮影すると、圧縮された後に写真が不可解に回転します。問題の解決を続けます。

IOS画像回転の解決策

まずexif.jsを引用し、EXIF.getDataとEXIF.getTagを通じて写真の方向情報を取得します。

//file通过input标签获取
EXIF.getData(file,function(){
  orientation=EXIF.getTag(file,&#39;Orientation&#39;);
});

iPhoneでの写真撮影に対応する各方向の値の意味は次のとおりです:

orientation説明3iPhoneの水平画面撮影今回はキーは左側にあり、写真は元の位置に対して180度回転しています6このとき、iPhoneはポートレートモードで撮影されています(通常の持ち方向)。携帯電話)、画像は元の位置に対して反時計回りに 90 度回転できます8 このとき、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;
}

その後、写真をアップロードしたところ、IOSでは写真が正常であることがわかりました。

完全なコードは以下のとおりです:

$(&#39;input[type=file]&#39;).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,&#39;Orientation&#39;);
    });

    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(&#39;canvas&#39;);
        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(&#39;image/jpeg&#39;, quality/100);
        //获取识别结果
        ...
      }
      image.src=dataURL;
    };
    reader.readAsDataURL(file);
  }else{
    alert("只能识别图片!")
  }
});

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。

関連する推奨事項:

H5 の新しい属性オーディオとビデオの制御分析について

Angular で複数の H5 画像をアップロードする方法

以上がH5がカメラを呼び出して写真を撮って圧縮するコードについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。