HTML 5新タグのCanvas
Canvasは、Webページに画像を表示し、コンテンツをカスタマイズするために使用され、基本的にはJavaScriptで操作できるビットマップ(bitmap)である.
Canvas APIはウェブページのリアルタイム生成画像に用いられ、JavaScriptはAPIを介して画像コンテンツを操作する.このような利点は、HTTPリクエスト数を減らし、ダウンロードしたデータを減らし、Webページのロード時間を速め、画像をリアルタイムで処理できることです.
使用する前に、まずCanvasのWebページ要素を作成する必要があります.
<canvas id="myCanvas" width="400" height="200">
canvas!
</canvas>
ブラウザがcanvasをサポートしていない場合、canvasラベルの中央に「ブラウザがcanvasをサポートしていません!」という文字が表示されます.
次に、JavaScriptを使用してcanvasのDOMオブジェクトを取得します.
var canvas = document.getElementById('myCanvas');
次に、ブラウザがCanvas APIをサポートしているかどうかを確認します.getContextメソッドが導入されているかどうかを確認します.
if (canvas.getContext) {
//some code here
}
getContext('2 d')メソッドを使用して、平面画像のコンテキスト環境を初期化します.
var ctx = canvas.getContext('2d');
これでcanvasの間に平面画像が生成されます.
2、製図方法
(1)塗りつぶし色
塗りつぶし色を設定します.
ctx.fillStyle = "#000000";//
ctx.strokeStyle = "#FF6600"; //
(2)長方形を描く
塗りつぶした長方形を描画します.
ctx.fillStyle = "#000000";// ,
ctx.fillRect(x, y, width, height);
中空の長方形を描画します.
ctx.strokeStyle = "#FF6600"; // ,
ctx.strokeRect(x, y, width, height);
長方形の領域の内容をクリアします.
ctx.clearRect(x, y, width, height);
(3)描画パス
ctx.beginPath(); //
ctx.moveTo(20, 20); //
ctx.lineTo(200, 20); // 200, 20
ctx.lineWidth = 1.0; //
ctx.strokeStyle = "#CC0000"; //
ctx.stroke(); // ,
(4)円形と扇形を描く
扇形を描く方法.
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
arc法のxおよびyパラメータは円心座標であり、radiusは半径であり、startAngleおよびendAngleは扇形の開始角度および終了角度(キツネ度)であり、anticlockwiseは作図が反時計回りに描くべきか、それとも時計回りに描くべきかを示す.
ソリッドの円形を描画します.
ctx.beginPath();
ctx.arc(60, 60, 50, 0, Math.PI*2, true);
ctx.fillStyle = "#000000";
ctx.fill();
中空円形を描画します.
ctx.beginPath();
ctx.arc(60, 60, 50, 0, Math.PI*2, true);
ctx.lineWidth = 1.0;
ctx.strokeStyle = "#000";
ctx.stroke();
(5)描画テキスト
fillTextメソッドはテキストを追加し、strokeTextメソッドは中空文字を追加します.使用する前に、フォント、対文方向、色などの属性を設定する必要があります.
ctx.font = "Bold 20px Arial"; //设置字体
ctx.textAlign = "left"; //设置对齐方式
ctx.fillStyle = "#008600"; //设置填充颜色
ctx.fillText("Hello!", 10, 50); //设置字体内容,以及在画布上的位置
ctx.strokeText("Hello!", 10, 100); //绘制空心字
fillTextメソッドでは、すべてのテキストが1行に表示されるテキストブレークはサポートされていません.したがって、複数行のテキストを生成するには、複数のfillTextメソッドを呼び出すしかありません.
グラデーションカラーを設定します.
var myGradient = ctx.createLinearGradient(0, 0, 0, 160);
myGradient.addColorStop(0, "#BABABA");
myGradient.addColorStop(1, "#636363");
createLinearGradientメソッドの参照は(x 1,y 1,x 2,y 2)であり、x 1とy 1は始点座標、x 2とy 2は終点座標である.座標値を変えることで、上から下へ、左から右へのグラデーションなどを生成できます.
addColorStopメソッドのパラメータは(offset,color)であり、offsetは0.0から1.0の範囲の浮動小数点値であり、グラデーションの開始点と終了点の間の一部を表し、offsetは0が開始点に対応し、offsetは1が終了点に対応し、colorはCSS色値の文字列で表される.
使用方法は、
ctx.fillStyle = myGradient;
ctx.fillRect(10, 10, 200, 100);
ctx.shadowOffsetX = 10; //设置水平位移
ctx.shadowOffsetY = 10; //设置垂直位移
ctx.shadowBlur = 5; //设置模糊度
ctx.shadowColor = "rgba(0, 0, 0, 0.5)"; //设置阴影颜色
ctx.fillStyle = "#CC0000";
ctx.fillRect(10, 10, 200, 100);
canvasでは、画像ファイルをキャンバスに挿入できます.画像を読み込んだ後、drawImageメソッドを使用してキャンバス内で再描画します.
var img = new Image();
img.src = "image.png";
ctx.drawImage(img, 0, 0); //设置对应的图像对象,以及它在画布上的位置
画像の読み込みに時間がかかるため、drawImageメソッドは画像の完全な読み込み後にのみ呼び出されるため、上記のコードを書き換える必要があります.
var image = new Image();
image.onload = function() {
if (image.width != canvas.width) {
canvas.width = image.width;
}
if (image.height != canvas.height) {
canvas.height = image.height;
}
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(image, 0, 0);
}
image.src = "image.png";
drawImage()メソッドでは、3つのパラメータが受け入れられます.1つ目のパラメータは画像ファイルのDOM要素(すなわちimgラベル)、2つ目と3つ目のパラメータはcanvas要素の左上隅の座標で、前例の(0,0)は画像の左上隅をcanvas要素の左上隅に配置することを示します.span>
getImageDataメソッドは、Canvasのコンテンツを読み取り、各ピクセルの情報を含むオブジェクトを返すために使用できます.
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
imageDataオブジェクトにはdataプロパティがあり、その値は1次元配列です.この配列の値は、各画素の赤、緑、青、alphaチャネル値の順であるため、この配列の長さは画像の画素幅*画像の画素高さ*4に等しく、各値の範囲は0~255である.この配列は読み取り可能であるだけでなく、書き込み可能であるため、この配列の値を操作することで、操作画像の宛先を達成することができる.この配列を変更したら、putImageDataメソッドを使用して配列内容をCanvasに書き直します.
context.putImageData(imageData, 0, 0);
filterが画素を処理する関数であると仮定すると、Canvasに対する処理フロー全体は、以下のコードで表すことができる.
if (canvas.width > 0 && canvas.height > 0) {
var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
filter(imageData);
context.putImageData(imageData, 0, 0);
}
以下に、いくつかの一般的な処理方法を示します.
(1)階調効果
グレースケールマップ(grayscale)は、赤、緑、青の3つの画素値の算術平均値をとり、実際に画像を白黒形式に変換します.d[i]が画素配列の1画素の赤色値であると仮定すると、d[i+1]は緑色値、d[i+2]は青色値、d[i+3]はalphaチャネル値である.階調に変換するアルゴリズムは、赤、緑、青の3つの値を加算して3で割って、結果を配列に戻すことです.
grayscale = function(pixels) {
var d = pixels.data;
for (var i = 0; i < d.length; i += 4) {
var r = d[i];
var g = d[i + 1];
var b = d[i + 2];
d[i] = d[i + 1] = d[i + 2] = (r + g + b) / 3;
}
return pixels;
}
(2)レトロ効果
レトロ効果(sepia)は、赤、緑、青の3つの画素をそれぞれこの3つの値の何らかの重み付け平均値をとり、画像に古い効果をもたらす.
sepia = function(pixels) {
var d = pixels.data;
for (var i = 0; i < d.length; i +=4) {
var r = d[i];
var g = d[i + 1];
var b = d[i + 2];
d[i] = (r * 0.393) + (g * 0.769) + (b * 0.189); //red
d[i + 1] = (r * 0.349) + (g * 0.686) + (b * 0.168); //green
d[i + 2] = (r * 0.272) + (g * 0.534) + (b * 0.131); //blue
}
return pixels;
}
(3)赤色マスク効果
赤色マスクとは、画像を赤くする効果を指す.アルゴリズムは、赤チャネルを赤、緑、青の3つの値の平均値に設定し、緑チャネルと青チャネルを0に設定します.
red = function(pixels) {
var d = pixels.data;
for (var i = 0; i < d.length; i += 4) {
var r = d[i];
var g = d[i + 1];
var b = d[i + 2];
d[i] = (r + g + b) / 3; //红色通道取平均值
d[i + 1] = d[i + 2] = 0;
}
return pixels;
}
(4)輝度効果
輝度効果(brightness)とは、画像をより明るくまたは暗くすることを意味します.アルゴリズムは、赤チャネル、緑チャネル、青チャネルを正または負の値で加算します.
brightness = function(pixels, delta) {
var d = pixels.data;
for (var i = 0; i < d.length; i += 4) {
d[i] += delta; //red
d[i + 1] += delta; //green
d[i + 2] += delta; //blue
}
return pixels;
}
(5)反転効果
反転効果(invert)とは、画像が色を逆転させる効果を示すことである.アルゴリズムは、赤、緑、青のチャネルがそれぞれ逆の値(255-元の値)を取ります.
invert = function(pixels) {
var d = pixels.data;
for (var i = 0; i < d.length; i += 4) {
d[i] = 255 - d[i];
d[i + 1] = 255 - d[i + 1];
d[i + 2] = 255 - d[i + 2];
}
return pixels;
}
画像データを変更した後、toDataURLメソッドを使用して、Canvasデータを一般的な画像ファイル形式に再変換することができます.
function convertCanvasToImage(canvas) {
var image = new Image();
image.src = canvas.toDataURL("image/png");
return image;
}
saveメソッドはコンテキスト環境を保存し、restoreメソッドは前回保存したコンテキスト環境に復元します.
ctx.save();
ctx.shadowOffsetX = 10;
ctx.shadowOffsetY = 10;
ctx.shadowBlur = 5;
ctx.shadowColor = "rgba(0, 0, 0, 0.5)";
ctx.fillStyle = "#CC0000";
ctx.fillRect(10, 10, 150, 150);
ctx.restore();
ctx.fillStyle = "#000000";
ctx.fillRect(180, 10, 150, 100);
上のコードは全部で2つの矩形を描き、前にシャドウがあり、後にはありません.
[1] David Walsh, JavaScript Canvas Image Conversion
[2] Matt West, Getting Started With The Canvas API
[3] John Robinson, How You Can Do Cool Image Effects Using HTML5 Canvas
注:http://javascript.ruanyifeng.com/htmlapi/canvas.html
から