目次
はじめに
元の画像 File オブジェクトを取得します
Cropper を初期化します
Drawing Canvas
Base64 から Blob オブジェクトへ
ホームページ ウェブフロントエンド htmlチュートリアル Flash を使用しない画像のトリミング -- HTML5 中級上級_html/css_WEB-ITnose

Flash を使用しない画像のトリミング -- HTML5 中級上級_html/css_WEB-ITnose

Jun 24, 2016 am 11:18 AM

はじめに

画像のトリミングとアップロードは、ユーザーエクスペリエンスに非常に適した機能であるだけでなく、特定の画像サイズを統一し、Webサイトのレイアウトを最適化し、一石二鳥の効果もあります。

要件はシンプルで、ブラウザーで画像を切り取ってサーバーにアップロードするだけです。

私が最初に考えた方法は、画像とトリミングパラメータ(x、y、スケール、回転)をサーバーにアップロードすることで、サーバーが画像処理を行うので、とても簡単です。

しかし、これは開発のトレンドに沿っていません: フロントエンドでできる処理はフロントエンドにやらせます。

トレンドに妥協した結果、フロントエンドはますます複雑になります。

最初は、ブラウザが画像を読み取って生成できるとは思いませんでした。考えてみてください。「クリックしてコピー」などの単純な機能を実行するには、Flash ブラウザを使用する必要があり、権限はそれほど大きくありません。

画像をローカルで処理する限り、基本的には Flash を使用します。コピーするだけです。API はありません。画像を変更できても、アップロード パスを変更する方法がわかりません。さらに重要なのは、私は Flash について何も知りません。

幸いなことに、私たちの Web サイトは IE9 以下のブラウザーを完全に放棄し、最新の HTML5 ブラウザーとのみ互換性があります。 (Opera や Microsoft でさえ Webkit カーネル路線をたどり始めており、Chrome を追随する傾向にあります。) 私は HTML5 に期待するしかないので、少し調べてみたところ、次のプロセスが実現可能であることがわかりました。

st=>start: 原图片 File 对象e=>end: 上传裁剪后的Blob对象op=>operation: 初始化Cropper 图片Base64预览op1=>operation: 根据Cropper裁剪参数绘制Canvas(Base64)op2=>operation: Base64转Blob对象st->op->op1->op2->e
ログイン後にコピー

各リンクについては、以下で詳しく説明します。

元の画像 File オブジェクトを取得します

各画像ファイルの処理の始まりは onchange イベントによって開始されます

<script>    function handler(e){        var originPhoto = e.target.files[0]; // IE10+ 单文件上传取第一个        window.originFileType = originPhoto.type; //暂存图片类型        window.originFileName = originPhoto.name; //暂存图片名称        ...    }</script><input type="file" name="demo" onchange='handler(event)' accept="image/*" ><img id="preview"><button onclick="cropAndUpload()">确定并上传</button>
ログイン後にコピー

Cropper を初期化します

ここでは非常に使いやすいライブラリ Cropper.js を紹介します

https:/ /github .com/fengyuanchen/cropper

マスクの生成、トリミングパラメータの取得、キャンバスの出力...そしてそれは非常に軽量で、圧縮された CSS コードと JS コードはわずか 30 KB です。 JQuery をベースにしているため、JQuery の導入は少し複雑になる可能性があります。しかし、現在 JQuery を使用していない Web サイトはどれでしょうか?

IE9+と互換性があり、優れたモバイルエクスペリエンスを備え、タッチズームやドラッグに応答できます。以下は Android 4.4 のネイティブブラウザでのプレビュー画像です

function handler(event){    ...    var URL = window.URL || window.webkitURL , originPhotoURL;    originPhotoURL = URL.createObjectURL(originPhoto);   //Base64    $('#preview').cropper({        aspectRatio: 1 / 1,                 // 固定裁剪比例1:1,裁剪后的图片为正方形    }).cropper('replace', originPhotoURL);  // 动态设置图片预览}
ログイン後にコピー

Drawing Canvas

Cropper.js には、Canvas を生成するメソッド getCroppedCanvas が用意されており、生成されるキャンバスのサイズを指定できます。

または、getData に基づいてトリミング情報 (回転とスケーリングを含む) を取得し、ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) を使用して手動で描画します。後者の方が自由ですが、既製の方法があるので、それを使用してください。

function cropAndUpload(){    // 此处注意,生成的Canvas长宽比应与之前规定的裁剪比例一致    // 否则生成的图片会有失真    var size = {        width:100,        height:100    }    var croppedCanvas = $('#preview').cropper("getCroppedCanvas",size);  // 生成 canvas 对象    var croppedCanvasUrl = croppedCanvas.toDataURL(originFileType); // Base64    ...}
ログイン後にコピー

なお、幅と高さの値を固定値に設定することは推奨されません。クロップ フレームのサイズは 100 100 (500 500 など) を超える場合がありますが、実際に生成される画像は 100 100 です。この結果、500 500 の高解像度画像が 100 100 の歪んだ画像に直接圧縮されます。同様に、クロップ ボックスが 100 100 より小さい場合、生成された画像はぼやけます。

Base64 から Blob オブジェクトへ

文字列をバイナリに変換しますか? (フロントエンドは元々ページを作成するものでしたが、ファイル操作も行うようになりました。HTML5の登場以降、ブラウザもオペレーティングシステムとみなせるようになりました) 公式のDataURLtoBlobメソッドはないので、以下のように書くことしかできません。変換は非常に簡単です。ファイル タイプを逆アセンブルし、文字データを 16 進データに変換して配列に格納し、そのデータで Blob オブジェクトを初期化します。

function dataURLtoBlob(dataurl) {    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);    while(n--){        u8arr[n] = bstr.charCodeAt(n);    }    return new Blob([u8arr], {type:mime});}function cropAndUpload(){    ...    var croppedBlob = dataURLtoBlob(croppedCanvasUrl);    croppedBlob.name = originFileName; // Blob对象没有name    // Upload(croppedBlob);}
ログイン後にコピー

これで、この BLOB オブジェクトを FileObject のように処理できるようになりました。

実は、最新の HTML5 標準では HTMLCanvasElement.toBlob(callback, mimeType,quality) をサポートしています

croppedCanvas.toBlob(function(croppedBlob){    // Upload(croppedBlob);},originFileType)
ログイン後にコピー
遠回りしましたが、それでも勉強になりました。

MaxLeap チーム_UX メンバーの原著者: John Wang

元のリンク: https://blog.maxleap.cn/archives/705

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

HTMLは初心者のために簡単に学ぶことができますか? HTMLは初心者のために簡単に学ぶことができますか? Apr 07, 2025 am 12:11 AM

HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用​​できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

HTML、CSS、およびJavaScriptの役割:コアの責任 HTML、CSS、およびJavaScriptの役割:コアの責任 Apr 08, 2025 pm 07:05 PM

HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

HTMLでの開始タグの例は何ですか? HTMLでの開始タグの例は何ですか? Apr 06, 2025 am 12:04 AM

Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

HTML、CSS、およびJavaScriptの理解:初心者向けガイド HTML、CSS、およびJavaScriptの理解:初心者向けガイド Apr 12, 2025 am 12:02 AM

webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Apr 04, 2025 pm 11:54 PM

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

WebアノテーションにY軸位置の適応レイアウトを実装する方法は? WebアノテーションにY軸位置の適応レイアウトを実装する方法は? Apr 04, 2025 pm 11:30 PM

Y軸位置Webアノテーション機能の適応アルゴリズムこの記事では、単語文書と同様の注釈関数、特に注釈間の間隔を扱う方法を実装する方法を探ります...

HTML、CSS、およびJavaScript:Web開発者に不可欠なツール HTML、CSS、およびJavaScript:Web開発者に不可欠なツール Apr 09, 2025 am 12:12 AM

HTML、CSS、およびJavaScriptは、Web開発の3つの柱です。 1。HTMLは、Webページ構造を定義し、などなどのタグを使用します。2。CSSは、色、フォントサイズなどのセレクターと属性を使用してWebページスタイルを制御します。

CSS3とJavaScriptを使用して、クリック後に周囲の写真を散乱および拡大する効果を実現する方法は? CSS3とJavaScriptを使用して、クリック後に周囲の写真を散乱および拡大する効果を実現する方法は? Apr 05, 2025 am 06:15 AM

画像をクリックした後、散乱と周囲の画像を拡大する効果を実現するには、多くのWebデザインがインタラクティブな効果を実現する必要があります。特定の画像をクリックして周囲を作成してください...

See all articles