Kép kezelés, HTML5 Canvas Image
Ebben a részben a képek manipulálására, megjelenítésére fogjuk használni a HTML5 canvas újításait.
Mielőtt belevágnánk, nézzük meg, hogy milyen módszereket választhatunk egy kép kirajzolására. Igazából a drawImage(img, x,y) paraméterezésének különböző módozatai miatt van lehetőség más és más kirajzolási módokat választanunk.
Az első esetben egyszerű dolgunk van, fogjuk a drawImage(img,x,y) megfelelő paraméterezését – ahol x,y a kép bal felső sarkának koordinátái.
Lássuk, hogy inicializálunk és töltünk egy képet ebben az esetben a rajzvászonra. Ez némi plusz magyarázatra szorul. Először is, létre kell hoznunk egy img – kép element-et (var img=new Image();). Majd az img.onload =function(){ ide jön a végrehajtás rész, esetünkben a drawImage(img,x,y)} inicializáljuk. Lássuk egy egyszerű példán, hogy ez hogyan is néz ki.
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>CANVAS image manipulating tutorial</title>
<style>
#rajzvaszon {
border: 1px solid #3a3939; /*csak azért, hogy látszódjon, egy vékony keret*/
}
</style>
</head>
<body>
<canvas id="rajzvaszon" width="500" height="500"></canvas>
<script>
var canvas = document.getElementById('rajzvaszon');
var ctx = canvas.getContext('2d');
var img = new Image(); //kép element létrehozása
img.onload = function (){ //ide kerül a végrehajtás
ctx.drawImage(img,0,0); //kirajzoljuk a képet a 0,0 koordinátába
};
img.src = 'HTML5Logo.png'; //kép forrása
</script>
</body>
</html>
A példa itt elérhető, megtekinthető.
Most nézzük, ha több paramétert adunk a drawImage(img, x,y, rw,rh); – ebben az esetben is kirajzolja a képünket az x,y által meghatározott ponttól kezdve, de átméretezi rw (szélesség), és rh (magasság) méretűre.
Nézzük, a példánk hogyan módosul, ha csak 100×100-as méretben szeretném kirajzolni. Természetesen minden változatlan marad kivéve a DrawImage sora, az a következőképpen fog változni:
… ctx.drawImage(img,0,0,100,100); //kirajzoljuk a képet a 0,0 koordinátába 100x100-as méretben …
Itt megtekinthető az eredmény.
Természetesen ez még nem minden, hiszen a képünkből ki is vághatunk darabokat. Ilyen esetben így paraméterezzük a drawImage(img,cx,cy,cw,ch,x,y,rw,rh); – 1. ábra Igen, ez már az OMG kategória, de azért érthető. Szóval nézzük is, kivágja a megkapott img-ből a cx,cy (képrészlet bal felső sarka),cw (szélesség),ch (magasság) által kijelölt képrészletet, majd kirajzolja az x,y koordinátára rw,rh méretben. Nem gondoltam volna, hogy le tudom írni, de talán érthető lett.
Lássuk hogy, hogyan változik meg a kódrészletünk:
… ctx.drawImage(img,0,0,150,150,0,0,100,100); //kirajzoljuk a kép darabját a 0,0 koordinátába a megadott rw,rh méretben …
Itt megtekinthető a forrás és a végeredmény.
Most nézzük egy kis kép manipulációt. 🙂 Kezdjük valami egyszerűvel, talán egy szép árnyék effekt jó is lesz számunkra. A következő példában egy 3 pixel széles árnyékot teszünk a kirajzolt képünk köré, ezt a ctx.shadowOffsetX és ctx.shadowOffsetY paraméterek valamint a Blur beállításával tehetjük meg. A kódom a következő:
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>CANVAS image manipulating tutorial</title>
<style>
#rajzvaszon {
border: 1px solid #3a3939; /*csak azért, hogy látszódjon, egy vékony keret*/
}
</style>
</head>
<body>
<canvas id="rajzvaszon" width="300" height="300"></canvas>
<script>
var canvas = document.getElementById("rajzvaszon");
var ctx = canvas.getContext("2d"); //rajzvaszon inicializálása
var img = new Image(); //keptarolo letrehozasa
img.src = 'HTML5Logo.png'; // kep forrása
ctx.shadowOffsetX = 3; //árnyék beállítása
ctx.shadowOffsetY = 3;
ctx.shadowBlur = 2; //egy kis homályosítás
ctx.shadowColor = "black"; //árnyék színe
img.onload = function() { //kep kirajzolasa
ctx.drawImage(img, 10, 10);
}
</script>
</body>
</html>
A példa itt elérhető, megtekinthető.
Nézzünk egy kis pixel szintű képmanipulációt is. Ezt ne próbáljátok ki otthon. 🙂 Nézzük ehhez milyen függvények kellenek.
- getImageData();
- putImageData();
Használata: imageData = ctx.getImageData(0, 0, width, height); – ahogy látható az imageData objektum (pixel tömb) tárolja az adott rajzvászon terület pixeleinek információit.
1 pixelhez egészen pontosan négy adatot tárolunk el. Az első elem a piros, a második a zöld, a harmadik a kék, a negyedig pedig az átlátszóságát. Ezzel gyakorlatilag leírjuk a pixel összes adatát, amit ezután könnyedén manipulálhatunk, majd a putImageData(); függvény segítségével ki is rajzolhatunk.
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>CANVAS image manipulating tutorial</title>
<style>
#rajzvaszon {
border: 1px solid #3a3939; /*csak azért, hogy látszódjon, egy vékony keret*/
}
</style>
</head>
<body>
<canvas id="rajzvaszon" width="500" height="300"></canvas>
<script>
function imageLoaded() {
canvas = document.getElementById("rajzvaszon");
ctx = canvas.getContext("2d");
width = parseInt(canvas.getAttribute("width")); //kiolvassuk a canvas méreteit és letároljuk
height = parseInt(canvas.getAttribute("height"));
ctx.drawImage(img, 0, 0); // a bal felső sarokba kirajzoljuk a képet
imageData = ctx.getImageData(0, 0, width, height); //kinyerjük az összes pixelünk adatait
w2 = width / 2;
for (y = 0; y < height; y++) { //végig megyünk a kép pixelein
be = y * width * 4; // 4 / pixel
ki = be + w2 * 4
for (x = 0; x < w2; x++) {
r = imageData.data[be++] / 3; // kevesebb piros
g = imageData.data[be++] * 3; // több zöld
b = imageData.data[be++] /3 ; // kevesebb kék
a = imageData.data[be++]; // alpha ugyanaz
b = Math.min(255, b); // 0..255
imageData.data[ki++] = r;
imageData.data[ki++] = g;
imageData.data[ki++] = b;
imageData.data[ki++] = a;
}
}
// a megváltozott adatok kiiratása
ctx.putImageData(imageData, 0, 0);
}
img = new Image();
img.onload = imageLoaded;
img.src = "HTML5Logo.png";
</script>
</body>
</html>
Itt meg tudod nézi a zöld példánkat.
A következő részben az animációs lehetőségeket fogjuk megnézni. Addig is jó hétvégét mindenkinek!
Forrás:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#images

Kép kezelés, HTML5 Canvas Image a Creative Commons Nevezd meg! – Ne add el! – Így add tovább! 2.5 Magyarország Licenc alatt van.
Permissions beyond the scope of this license may be available at https://html5.ugyesen.com.

