html5 canvasベースの宿題添削用スモールプラグイン
今日は、会社からの新しい要望、つまり、返却された課題写真に添削を落書きして、添削が終わったら添削写真と一緒にサーバーにアップロードできるようにしたいのです。これは、キャンバスにあまり慣れていない私にとっては難題です。
要求分析
- 修正能力は絵筆に匹敵する
- 筆おろしを行うことができること {を使用します。 全ブラシクリア {を使用します。
- ブラシの色を変換する
アイデアの技術的実現
この要件を聞いて最初に思ったのは、canvasでやるということだったので、w3schoolで読んでみたところ キャンバスのAPI .
1. APIを使用して、画像をcanvasに転送する。 drawImage()
2 ペイントブラシの実装
- マウスが押されたとき(マウスダウン)、開始X、開始Yのポイントが記録されます。
- マウスを移動したとき(mousemove)、現在のマウス座標 e.clientX, e.clientY を取得し、左側の線の軸の最後の点(lineTo )を取得するので、水平線を描くことができる。 {を使用します。 マウスが左ボタンを離した時(mouseup)、mousemove関数をクリアする。
3. 関数をクリアする:drawImage()関数で元の画像を再度リセットするように指示する
4. Withdraw機能:マウスを押すたびにgetImageData()関数で現在の画像を取得して配列に記録し、withdrawを押したときにputImageData()関数でそれをキャンバスに入れるようにします。
5. 筆の色:strokeStyleのペンの色をmousemoveの中で変更する
コードの実装
マウスを動かして線を引くためのコード
let self = this;
this.canvasNode = document.createElement('canvas');
let styleString = this.utils.formatStyle(CANVAS_STYLE); // CANVAS_STYLE is the style of the canvas
this.canvasNode.setAttribute('id','canvas');
// Make sure to set the width and height
let ratio = this.imgNode.width / this.imgNode.height, height = this.imgNode.height, width = this.imgNode.width;
let tempWidth , tempHeight;
// scale to scale
if(ratio >= window.innerWidth / window.innerHeight){
if(width > window.innerWidth){
tempWidth = window.innerWidth;
tempHeight = height * window.innerWidth / width;
} else {
tempWidth = width;
tempHeight = height;
}
}else {
if(height > window.innerHeight){
tempWidth = width * window.innerHeight / width;
tempHeight = window.innerHeight;
}else{
tempWidth = width;
tempHeight = height;
}
}
this.canvasNode.height = tempHeight;
this.canvasNode.width = tempWidth;
styleString = Object.assign({'width': tempWidth, 'height': tempHeight}, CANVAS_STYLE);
this.canvasNode.setAttribute('style', styleString);
let ctx = this.canvasNode.getContext('2d'), startX = 0, startY = 0;
let image = new Image() ;
image.setAttribute("crossOrigin",'Anonymous')
// add a timestamp because the domain name of this image is not set cross domain https://www.jianshu.com/p/c3aa975923de
image.src = this.imgNode.src + '?t=' + new Date().getTime();
image.height = tempHeight;
image.width = tempWidth;
image.onload = function(){
ctx.drawImage(image, 0, 0, tempWidth, tempHeight);
}
// Mouseover event
let mousemoveFn = function(e) {
ctx.beginPath();
ctx.lineWidth = 3;
ctx.strokeStyle = self.currentColor;
if(startX == e.clientX - self.canvasNode.offsetLeft || startY === e.clientY - self.canvasNode.offsetTop ) return
ctx.moveTo(startX,startY);
ctx.lineTo(e.clientX - self.canvasNode.offsetLeft , e.clientY - self.canvasNode.offsetTop );
ctx.stroke();
startX = e.clientX - self.canvasNode.offsetLeft;
startY = e.clientY - self.canvasNode.offsetTop ; // 37 is the height of the header
}
// mouse press event
this.canvasNode.addEventListener("mousedown",function(e){
startX = e.clientX - self.canvasNode.offsetLeft;
startY = e.clientY - self.canvasNode.offsetTop ;
// If you record in mouseup, you have to do one more step when you withdraw
let imageData = ctx.getImageData(0,0, self.canvasNode.width, self.canvasNode.height);
self.imageDataArray.push(imageData); // This imageDataArray is used to record the strokes of the brush
self.canvasNode.addEventListener("mousemove", mousemoveFn, false);
},false);
this.canvasNode.addEventListener('mouseup', function(e){
self.canvasNode.removeEventListener('mousemove', mousemoveFn);
});
this.bgNode.appendChild(this.canvasNode);
問題点
1。画像のクロスドメインの問題 このドメインは、唯一の192.168.6.*クロスドメインに設定されているため、私のlocalhostドメインはクロスドメインの問題を報告します(唯一の192.168.6.*クロスドメインに同僚が私に言った、それ以外の場合はまだ問題をチェックする愚かです)。
解決策:vue.config.js ファイルで dev 配下のホストを設定する。
2. toDataURL()メソッドで拡大縮小して保存すると、base64出力後に画像のサイズが変化してしまう。理由は キャンバスに画像を描画する際に、上記のコードで画像を拡大縮小するアルゴリズムを使って画像を小さくしたため、キャンバスに描画される画像も小さくなってしまった...。
解決方法 (解決済み)
概要
- canvas と画像の組み合わせに初めて触れたとき、canvas の API に慣れ親しみました。
- やったことのない機能に出会う前に、まず知っていることを使って実現可能な方法がないかを考え、突破口を見つけるとできるようになる、という心構えが必要です {を使用します。 知らない知識に出会ったら、まずapiを見ること、以前はcanvasのことをあまり知らなかったが、何度かapiを見ているうちに機能ができるようになり、w3schoolで見た例を見て、canvasは本当に強力だと感じた。
添削宿題をするためのhtml5キャンバスベースの小さなプラグインについてのこの記事はここで紹介されて、より関連するキャンバス添削宿題プラグインの内容は、スクリプトホーム過去の記事を検索するか、次の関連記事を閲覧を続けてください、私はあなたがよりスクリプトホームをサポートすることを願っています!。
関連
-
Html5プロジェクト適応システムダークカラーモードプログラム概要の詳細説明
-
HTML5 ドラッグ&ドロップの具体的な使用方法について
-
ラチェット式モーダルボックスの実装
-
顔決済機能の実装をベースにしたHTML5+tracking.js
-
HTML5レイアウトとHTML5タグの説明
-
IphoneXなどのHtml5モバイル化
-
HTML5で実現する写真・カメラ機能
-
HTML5 動画再生プラグイン video.js のご紹介
-
HTML5新タグの互換性 --> <! --<if lt IE 9><!endif--> の2つの方法があります。
-
ベッセル曲線の軌跡アニメーションのためのCanvasサンプルコード
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン