ÐÑполÑзование изобÑажений
Ðо ÑиÑ
Ð¿Ð¾Ñ Ð¼Ñ Ñоздавали наÑи ÑобÑÑвеннÑе ÑигÑÑÑ Ð¸ пÑименÑли ÑÑили к ним. Ðдна из ÑамÑÑ
впеÑаÑлÑÑÑиÑ
ÑÑнкÑий <canvas> ÑÑо возможноÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñажений. Ðни могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкого композиÑинга ÑоÑо или как ÑÐ¾Ð½Ñ Ð³ÑаÑиков, Ð´Ð»Ñ ÑпÑайÑов в игÑаÑ
, и Ñак далее. ÐнеÑние изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð² лÑбÑÑ
поддеÑживаемÑÑ
бÑаÑзеÑом ÑоÑмаÑаÑ
, ÑакиÑ
как PNG, GIF, или JPEG. ÐÑ Ð¼Ð¾Ð¶ÐµÑе даже иÑполÑзоваÑÑ Ð¸Ð·Ð¾Ð±Ñажение, пÑоизведÑнное дÑÑгими canvas ÑлеменÑами на Ñой же ÑÑÑаниÑе как иÑÑоÑник!
ÐмпоÑÑиÑование изобÑажений в canvas в оÑновном ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· 2 ÑÑапов:
- Ðав ÑÑÑÐ»ÐºÑ Ð½Ð°
HTMLImageElementобÑÐµÐºÑ Ð¸Ð»Ð¸ Ð´Ð»Ñ Ð´ÑÑгого canvas ÑлеменÑа как иÑÑоÑник. Также можно иÑполÑзоваÑÑ Ð¸Ð·Ð¾Ð±Ñажение дав ÑÑÑÐ»ÐºÑ Ð½Ð° URL. - ÐÐ»Ñ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° canvas иÑполÑзÑеÑÑÑ ÑÑнкÑиÑ
drawImage().
ÐавайÑе поÑмоÑÑим как ÑÑо ÑделаÑÑ.
ÐÑполÑзование изобÑажений Ð´Ð»Ñ ÑиÑованиÑ
Canvas API Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð²Ñе пеÑеÑиÑленнÑе далее ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ ÐºÐ°Ðº иÑÑоÑник изобÑажениÑ:
HTMLImageElement-
ÐÑи изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑозданÑ, иÑполÑзÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑ
Image(), Ñакже как вÑе<img>ÑлеменÑÑ. HTMLVideoElement-
ÐÑполÑзÑÑ HTML
<video>ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ°Ðº иÑÑоÑник изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ñ Ð²Ð°ÑÑÐ²Ð°ÐµÑ ÑекÑÑий ÐºÐ°Ð´Ñ Ð¸Ð· видео и иÑполÑзÑÐµÑ ÐµÐ³Ð¾ как изобÑажение. HTMLCanvasElement-
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´ÑÑгой
<canvas>ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐºÐ°Ðº иÑÑоÑник изобÑажениÑ.
ÐÑи иÑÑоÑники ÑовмеÑÑно именÑемÑе по ÑÐ¸Ð¿Ñ CanvasImageSource.
ÐÑÑÑ Ð½ÐµÑколÑко ÑпоÑобов, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° Ñ Ð¾Ð»ÑÑе.
ÐÑполÑзование изобÑажений из Ñой же ÑÑÑаниÑÑ
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° изобÑажение, на Ñой же ÑÑÑаниÑе, на canvas Ñ Ð¸ÑполÑзÑÑ Ð¾Ð´Ð¸Ð½ из ÑпоÑобов:
document.imagesколлекÑиÑ- The
document.getElementsByTagName()меÑод - ÐÑли Ð²Ñ Ð·Ð½Ð°ÐµÑе id конкÑеÑного изобÑажениÑ, коÑоÑÑй Ð²Ñ Ñ
оÑиÑе иÑполÑзоваÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ
document.getElementById (), ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑо конкÑеÑное изобÑажение
ÐÑполÑзование изобÑажений из дÑÑÐ³Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²
ÐÑполÑзование crossorigin аÑÑибÑÑа <img> ÑÐ»ÐµÐ¼ÐµÐ½Ñ (оÑобÑажаеÑÑÑ HTMLImageElement.crossOrigin ÑвойÑÑва), Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе запÑоÑиÑÑ ÑазÑеÑение на загÑÑÐ·ÐºÑ Ð´ÑÑгого домена Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² drawImage(). ÐÑли Ñ
оÑÑинг домен ÑазÑеÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к Ð¼ÐµÐ¶Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¸Ð·Ð¾Ð±ÑажениÑ, Ñо изобÑажение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано в ваÑем canvas без without tainting it;инаÑе он Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑпоÑÑиÑÑ Ð²Ð°Ñ canvas.
ÐÑполÑзование дÑÑÐ³Ð¸Ñ canvas ÑлеменÑов
Ðак и Ñ Ð¾Ð±ÑÑнÑми изобÑажениÑми, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к дÑÑгим canvas ÑлеменÑам иÑполÑзÑÑ Ð»Ð¸Ð±Ð¾ document.getElementsByTagName() либо document.getElementById() меÑод. ÐÑовеÑÑÑе, ÑÑо в canvas иÑÑоÑнике Ñже ÑÑо-Ñо наÑиÑовано, пÑежде Ñем иÑполÑзоваÑÑ ÐµÐ³Ð¾ в Ñелевом изобÑажении canvas.
Ðдним из ÑдобнÑÑ ÑпоÑобов бÑло Ð±Ñ Ð¸ÑполÑзование вÑоÑого ÑлеменÑа canvas в каÑеÑÑве миниаÑÑÑÑ Ð´ÑÑгого болÑÑего изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ canvas.
Создание изобÑажений Ñ Ð½ÑлÑ
ÐÑÑгой ÑпоÑоб ÑÑо ÑоздаÑÑ Ð½Ð¾Ð²Ñе HTMLImageElement обÑекÑÑ Ð² наÑем ÑкÑипÑе. ЧÑÐ¾Ð±Ñ ÑÑо ÑделаÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑдобнÑй Image() конÑÑÑÑкÑоÑ:
var img = new Image(); // СоздаÑÑ Ð½Ð¾Ð²Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð·Ð¾Ð±ÑажениÑ
img.src = "myImage.png"; // УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿ÑÑÑ
Ðогда ÑÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ Ð²ÑполниÑÑÑ, изобÑажение наÑнÑÑ Ð·Ð°Ð³ÑÑжаÑÑÑÑ.
ÐÑли Ð²Ñ Ð¿Ð¾Ð¿ÑÑаеÑеÑÑ Ð²ÑзваÑÑ ÑÑнкÑÐ¸Ñ drawImage() пеÑед Ñем как изобÑажение загÑÑзиÑÑÑ, Ñо ÑкÑÐ¸Ð¿Ñ Ð½Ð¸Ñего не ÑÐ´ÐµÐ»Ð°ÐµÑ (или, в ÑÑаÑÑÑ
бÑаÑзеÑаÑ
, Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð¶Ðµ вÑдаÑÑ Ð¸ÑклÑÑение). ÐоÑÑÐ¾Ð¼Ñ Ð²Ð°Ð¼ необÑ
одимо иÑполÑзоваÑÑ ÑобÑÑие load, ÑÑÐ¾Ð±Ñ Ð²Ñ Ð½Ðµ пÑÑалиÑÑ ÑделаÑÑ ÑÑо пÑежде, Ñем изобÑажение загÑÑзиÑÑÑ:
var img = new Image(); // СоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ изобÑажение
img.addEventListener(
"load",
function () {
// здеÑÑ Ð²ÑполнÑÐµÑ drawImage ÑÑнкÑиÑ
},
false,
);
img.src = "myImage.png"; // УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¸ÑÑоÑник Ñайла
ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе ÑолÑко одно ÑÑоÑоннее изобÑажение, Ñо ÑÑÐ¾Ñ Ð¼ÐµÑод Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñ Ð¾ÑоÑим пÑимеÑом, но еÑли нÑжно ÑледиÑÑ Ð·Ð° неÑколÑкими изобÑажениÑми, Ñо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пÑидÑмаÑÑ ÑÑо-Ñо более Ñмное. ХоÑÑ Ð¿Ð¾Ð¸Ñки ÑакÑики пÑовеÑки загÑÑзки изобÑажений вÑÑ Ð¾Ð´ÑÑ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ ÑÑого обÑÑаÑÑего кÑÑÑа, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð± ÑÑом помниÑÑ.
Ðложение изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð°Ð½Ð½ÑÑ : URL
ÐÑÑгой возможнÑй ÑпоÑоб вклÑÑиÑÑ Ð¸Ð·Ð¾Ð±Ñажение ÑÑо ÑеÑез data: url. Data URLs позволÑÐµÑ Ð²Ð°Ð¼ полноÑÑÑÑ Ð¾Ð¿ÑеделиÑÑ Ð¸Ð·Ð¾Ð±Ñажение как Base64 кодиÑованнÑÑ ÑÑÑÐ¾ÐºÑ Ñимволов пÑÑмо в Ð²Ð°Ñ ÐºÐ¾Ð´.
var img = new Image(); // СоздаÑÑ Ð½Ð¾Ð²Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ img
img.src =
"data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==";
Ðдним из пÑеимÑÑеÑÑв data URLs ÑÑо Ñо ÑÑо полÑÑенное изобÑажение доÑÑÑпно ÑÑÐ°Ð·Ñ Ð±ÐµÐ· дÑÑÐ³Ð¸Ñ Ð·Ð°Ð¿ÑоÑов ÑÑда-обÑаÑно на ÑеÑвеÑ. ÐÑÑгое поÑенÑиалÑное пÑеимÑÑеÑÑво в Ñом, ÑÑо Ñакже можно инкапÑÑлиÑоваÑÑ Ð²ÑÑ Ð² одном Ñайле вÑе ваÑи CSS, JavaScript, HTML, и изобÑажениÑ, ÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ более поÑÑаÑивнÑм в дÑÑÐ³Ð¸Ñ Ð¼ÐµÑÑÐ°Ñ .
ÐекоÑоÑÑе недоÑÑаÑки ÑÑого меÑода в Ñом ÑÑо ваÑе изобÑажение не кеÑиÑовано, и Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñажений Ñ Ð±Ð¾Ð»ÑÑим ÑазмеÑом кодиÑование url Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ Ð¾ÑÐµÐ½Ñ Ð´Ð¾Ð»Ð³Ð¸Ð¼ пÑоÑеÑÑом.
ÐÑполÑзование кадÑов из видео
ÐÑ Ñакже можеÑе иÑполÑзоваÑÑ ÐºÐ°Ð´ÑÑ Ð¸Ð· видео пÑедÑÑавленнÑÑ
<video> ÑлеменÑом (даже еÑли видео не видно). ÐапÑимеÑ, еÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ <video> ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ID "myvideo", Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ:
function getMyVideo() {
var canvas = document.getElementById("canvas");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
return document.getElementById("myvideo");
}
}
ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÐµÑнÑÑ HTMLVideoElement обÑÐµÐºÑ Ð´Ð»Ñ ÑÑого видео, коÑоÑÑй, как Ð¼Ñ Ñпоминали Ñанее, ÑвлÑеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из обÑекÑов, коÑоÑÑй можно иÑполÑзоваÑÑ ÐºÐ°Ðº CanvasImageSource.
РиÑование изобÑажений
Ðак ÑолÑко Ð¼Ñ Ð¿Ð¾Ð»ÑÑили ÑÑÑÐ»ÐºÑ Ð½Ð° иÑÑоÑник обÑекÑа изобÑажениÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¼ÐµÑод drawImage() Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ в canvas. Ðак Ð¼Ñ Ñвидим далее, меÑод drawImage() пеÑегÑÑжен и Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð½ÐµÑколÑко ваÑианÑов. Рбазовом ваÑианÑе он вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº:
drawImage(image, x, y)-
РиÑÑÐµÑ Ð¸Ð·Ð¾Ð±Ñажение, Ñказанное в
CanvasImageSourceв кооÑдинаÑÐ°Ñ (x,y).
ÐÑимеÑание: SVG изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑказÑваÑÑ ÑиÑÐ¸Ð½Ñ Ð¸ вÑÑоÑÑ ÐºÐ¾Ñневого <svg> ÑлеменÑа.
ÐÑимеÑ: ÐÑоÑÑой линейнÑй гÑаÑик
Ð ÑледÑÑÑем пÑимеÑе, Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð²Ð½ÐµÑнее изобÑажение в каÑеÑÑве Ñона Ð´Ð»Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑого линейного гÑаÑика. ÐÑполÑзование Ñонов Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ Ð²Ð°Ñ ÑкÑÐ¸Ð¿Ñ Ð·Ð½Ð°ÑиÑелÑно менÑÑе, поÑÐ¾Ð¼Ñ ÑÑо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ избежаÑÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи пиÑаÑÑ ÐºÐ¾Ð´ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñона. Ð ÑÑом пÑимеÑе Ð¼Ñ Ð¸ÑполÑзÑем ÑолÑко один обÑаз, поÑÑÐ¾Ð¼Ñ Ñ Ð¸ÑполÑзÑÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑий изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа загÑÑзки Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов ÑиÑованиÑ. drawImage() меÑод опÑеделÑÑÑий меÑÑо Ñона Ñ ÐºÐ¾Ð¾ÑдинаÑами (0, 0), коÑоÑÑе пÑивÑÐ·Ð°Ð½Ñ Ðº веÑÑ
Ð½ÐµÐ¼Ñ Ð»ÐµÐ²Ð¾Ð¼Ñ ÑÐ³Ð»Ñ canvas.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
var img = new Image();
img.onload = function () {
ctx.drawImage(img, 0, 0);
ctx.beginPath();
ctx.moveTo(30, 96);
ctx.lineTo(70, 66);
ctx.lineTo(103, 76);
ctx.lineTo(170, 15);
ctx.stroke();
};
img.src = "backdrop.png";
}
ÐолÑÑивÑийÑÑ Ð³ÑаÑик вÑглÑÐ´Ð¸Ñ Ñак:
Ðзменение ÑазмеÑов
ÐÑоÑой ваÑÐ¸Ð°Ð½Ñ Ð¼ÐµÑода drawImage() добавлÑÐµÑ Ð´Ð²Ð° новÑÑ
паÑамеÑÑа и позволÑÐµÑ ÑазмеÑÑиÑÑ Ð¸Ð·Ð¾Ð±Ñажение в canvas Ñ Ð¸Ð·Ð¼ÐµÐ½ÑннÑми ÑазмеÑами.
drawImage(image, x, y, width, height)-
ÐÑо добавлÑÐµÑ Ð¿Ð°ÑамеÑÑ ÑиÑÐ¸Ð½Ñ Ð¸ вÑÑоÑÑ, коÑоÑÑе ÑказÑваÑÑ Ð´Ð¾ какого ÑазмеÑа нÑжно измениÑÑ Ð¸Ð·Ð¾Ð±Ñажение пÑи ÑиÑовании его в canvas.
ÐÑимеÑ: Тайлинг изобÑажениÑ
Ð ÑÑом пÑимеÑе, Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð¸Ð·Ð¾Ð±Ñажение в каÑеÑÑве обоев и повÑоÑим его в canvas неÑколÑко Ñаз. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñделано пÑоÑÑо ÑеÑез Ñикл, ÑаÑÐ¿Ð¾Ð»Ð°Ð³Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑннÑе изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° ÑазнÑÑ
позиÑиÑÑ
. Ркоде внизÑ, пеÑвÑй Ñикл for пÑоÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑÑдам. ÐÑоÑой Ñикл for пÑоÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ колонкам. ÐзобÑажение ÑменÑÑено на ÑÑеÑÑ Ð¾Ñ ÑеалÑного ÑазмеÑа, коÑоÑое бÑло 50x38 пикÑелей.
ÐÑимеÑание: ÐзобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑÑаÑÑ ÑазмÑÑÑми, пÑи болÑÑом ÑвелиÑении или зеÑниÑÑÑми пÑи знаÑиÑелÑном ÑменÑÑении. Ðозможно, лÑÑÑе вÑего не изменÑÑÑ ÑазмеÑÑ Ð¸Ð·Ð¾Ð±ÑажениÑ, еÑли на Ð½Ð¸Ñ ÐµÑÑÑ ÑекÑÑ, коÑоÑÑй должен оÑÑаÑÑÑÑ ÑиÑаемÑм.
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
var img = new Image();
img.onload = function () {
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 3; j++) {
ctx.drawImage(img, j * 50, i * 38, 50, 38);
}
}
};
img.src = "rhino.jpg";
}
ÐолÑÑивÑийÑÑ ÑиÑÑнок canvas вÑглÑÐ´Ð¸Ñ Ñак:
ÐаÑезка
У ÑÑеÑÑего и поÑледнего ваÑианÑа меÑода drawImage() в дополнении к иÑÑоÑÐ½Ð¸ÐºÑ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐµÑÑÑ ÐµÑÑ Ð²Ð¾ÑÐµÐ¼Ñ Ð¿Ð°ÑамеÑÑов . Ðн позволÑÐµÑ Ð½Ð°Ð¼ вÑÑезаÑÑ ÐºÑÑок из изобÑажениÑ, заÑем измениÑÑ ÐµÐ³Ð¾ ÑÐ°Ð·Ð¼ÐµÑ Ð¸ наÑиÑоваÑÑ ÐµÐ³Ð¾ в canvas.
drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)-
Рданном изобÑажении, ÑÑа ÑÑнкÑÐ¸Ñ Ð±ÐµÑÑÑ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¸Ð· изобÑажениÑ, в виде пÑÑмоÑголÑника, левÑй веÑÑ Ð½Ð¸Ð¹ Ñгол коÑоÑого - (
sx,sy), ÑиÑина и вÑÑоÑа -sWidthиsHeightи ÑиÑÑÐµÑ Ð² canvas, ÑаÑÐ¿Ð¾Ð»Ð°Ð³Ð°Ñ ÐµÐ³Ð¾ в ÑоÑке (dx,dy) и изменÑÑ ÐµÐ³Ð¾ ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð° ÑказаннÑе велиÑÐ¸Ð½Ñ Ð²dWidthиdHeight.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð°Ñезка, можно поÑмоÑÑеÑÑ Ð½Ð° изобÑажение ÑпÑава. ÐеÑвÑе ÑеÑÑÑе паÑамеÑÑа опÑеделÑÑÑ Ð¼ÐµÑÑоположение и ÑÐ°Ð·Ð¼ÐµÑ ÑÑагменÑа иÑÑ
одного изобÑажениÑ. ÐоÑледние ÑеÑÑÑе паÑамеÑÑа опÑеделÑÑÑ Ð¿ÑÑмоÑголÑник, в коÑоÑÑй бÑÐ´ÐµÑ Ð²Ð¿Ð¸Ñано изобÑажение на Ñелевом ÑиÑÑнке canvas.
ÐаÑезка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм инÑÑÑÑменÑом, когда Ð²Ñ Ð·Ð°Ñ Ð¾ÑиÑе ÑделаÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸ÑиÑ. ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑобÑаÑÑ Ð²Ñе ÑлеменÑÑ Ð² одном Ñайле изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ иÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñии. ÐапÑимеÑ, еÑли Ð²Ñ Ð·Ð°Ñ Ð¾ÑиÑе ÑделаÑÑ Ð³ÑаÑик, Ð²Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑделаÑÑ PNG изобÑажение, ÑодеÑжаÑее вÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе ÑекÑÑÑ Ð² одном Ñайле и в завиÑимоÑÑи Ð¾Ñ Ð²Ð°ÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ , могли Ð±Ñ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑо изменÑÑÑ Ð³ÑаÑик. ÐÑÑгим пÑеимÑÑеÑÑвом ÑвлÑеÑÑÑ Ñо, ÑÑо Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи загÑÑжаÑÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ изобÑажение по оÑделÑноÑÑи, полÑÑив возможноÑÑÑ ÑвелиÑиÑÑ ÑкоÑоÑÑÑ Ð·Ð°Ð³ÑÑзки.
ÐÑимеÑ: ÐбÑамление изобÑажениÑ
Ð ÑÑом пÑимеÑе, Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ñого же ноÑоÑога, ÑÑо и в пÑедÑдÑÑем пÑимеÑе, но Ð¼Ñ Ð¾ÑÑежем его Ð³Ð¾Ð»Ð¾Ð²Ñ Ð¸ вклÑÑим ÐµÑ Ð² ÑамкÑ. ÐзобÑажение Ñамки ÑÑо 24-Ñ Ð±Ð¸ÑнÑй PNG, коÑоÑÑй вклÑÑÐ°ÐµÑ Ð¿Ð°Ð´Ð°ÑÑÑÑ ÑенÑ. Так как в 24-Ñ Ð±Ð¸ÑнÑе PNG изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑÑаеÑÑÑ Ð¿Ð¾Ð»Ð½Ñй 8-ми биÑнÑй алÑÑа-канал, в оÑлиÑие Ð¾Ñ GIF и 8-биÑнÑÑ PNG изобÑажений, он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑÑн в лÑбой Ñон, без беÑпокойÑÑва о маÑовом ÑвеÑе.
<html>
<body onload="draw();">
<canvas id="canvas" width="150" height="150"></canvas>
<div style="display:none;">
<img id="source" src="rhino.jpg" width="300" height="227" />
<img id="frame" src="canvas_picture_frame.png" width="132" height="150" />
</div>
</body>
</html>
function draw() {
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
// РиÑÑем ÑÑагменÑ
ctx.drawImage(
document.getElementById("source"),
33,
71,
104,
124,
21,
20,
87,
104,
);
// РиÑÑем ÑамкÑ
ctx.drawImage(document.getElementById("frame"), 0, 0);
}
Ð ÑÑÐ¾Ñ Ñаз Ð¼Ñ Ð¿Ñименили дÑÑгой ÑпоÑоб загÑÑзки изобÑажениÑ. ÐмеÑÑо загÑÑзки меÑодом ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
HTMLImageElement обÑекÑов, Ð¼Ñ Ð²ÐºÐ»ÑÑили иÑ
как <img> ÑÑги пÑÑмо в Ð½Ð°Ñ HTML Ñайл и из ниÑ
вÑбÑали изобÑажениÑ. ÐзобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑкÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CSS-ÑвойÑÑва display, ÑÑÑановленного в "none" Ð´Ð»Ñ ÑÑиÑ
изобÑажений.
СкÑипÑ, Ñам по Ñебе, оÑÐµÐ½Ñ Ð¿ÑоÑÑой. ÐÐ°Ð¶Ð´Ð¾Ð¼Ñ <img> пÑиÑвоен аÑÑибÑÑ ID, коÑоÑÑй Ð´ÐµÐ»Ð°ÐµÑ ÑдобнÑм иÑ
вÑÐ±Ð¾Ñ Ñ Ð¸ÑполÑзованием document.getElementById(). ÐоÑом Ð¼Ñ Ð¿ÑоÑÑо иÑполÑзÑем ÑÑнкÑÐ¸Ñ drawImage(), ÑÑÐ¾Ð±Ñ Ð¸Ð· пеÑвого изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÑÑезаÑÑ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð½Ð¾ÑоÑога и вÑÑавиÑÑ ÐµÐ³Ð¾ в canvas, заÑем ÑиÑÑем ÑÐ°Ð¼ÐºÑ ÑвеÑÑ
Ñ, иÑполÑзÑÑ Ð²ÑоÑой вÑзов ÑÑнкÑии drawImage().
ÐÑÐ¸Ð¼ÐµÑ Ð³Ð°Ð»ÐµÑеи иÑкÑÑÑÑва
РпоÑледнем пÑимеÑе ÑÑой главÑ, Ð¼Ñ Ð¿Ð¾ÑÑÑоим неболÑÑÑÑ Ð³Ð°Ð»ÐµÑÐµÑ Ð¸ÑкÑÑÑÑв. ÐалеÑÐµÑ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑаблиÑÑ, вклÑÑаÑÑей неÑколÑко изобÑажений. Ðогда ÑÑÑаниÑа загÑÑзиÑÑÑ, <canvas> ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²ÑÑавиÑÑÑ Ð² каждое изобÑажение, а вокÑÑг бÑÐ´ÐµÑ Ð½Ð°ÑиÑована Ñамка.
Ð ÑÑом ÑлÑÑае, Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑикÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑиÑина и вÑÑоÑа, ÑÐ°ÐºÐ°Ñ Ð¶Ðµ, как и Ñ Ñамки наÑиÑованной вокÑÑг Ð½Ð¸Ñ . ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑÑовеÑÑенÑÑвоваÑÑ ÑÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ иÑполÑзовал ÑиÑÐ¸Ð½Ñ Ð¸ вÑÑоÑÑ Ð¸Ð·Ð¾Ð±ÑажениÑ, ÑÑÐ¾Ð±Ñ Ñамка идеалÑно его окÑÑжила.
Ðод ниже должен говоÑиÑÑ Ñам за ÑебÑ. ÐÑ Ð¿ÑоÑ
одим Ñиклом ÑеÑез document.images конÑÐµÐ¹Ð½ÐµÑ Ð¸ ÑооÑвеÑÑÑвенно добавлÑем новÑе ÑлеменÑÑ canvas. Ðозможно ÑледÑÐµÑ ÑпомÑнÑÑÑ Ð´Ð»Ñ ÑеÑ
, кÑо не ÑлиÑком Ñ
оÑоÑо знаком Ñ DOM, ÑÑо Ð´Ð»Ñ ÑÑого иÑполÑзÑеÑÑÑ Node.insertBefore меÑод. insertBefore() ÑÑо меÑод ÑодиÑелÑÑкого Ñзла (ÑÑейки ÑаблиÑÑ) ÑлеменÑа (изобÑажениÑ) пеÑед коÑоÑÑм Ð¼Ñ Ñ
оÑим вÑÑавиÑÑ Ð½Ð°Ñ Ð½Ð¾Ð²Ñй Ñзел (ÑÐ»ÐµÐ¼ÐµÐ½Ñ canvas).
<html>
<body onload="draw();">
<table>
<tr>
<td><img src="gallery_1.jpg" /></td>
<td><img src="gallery_2.jpg" /></td>
<td><img src="gallery_3.jpg" /></td>
<td><img src="gallery_4.jpg" /></td>
</tr>
<tr>
<td><img src="gallery_5.jpg" /></td>
<td><img src="gallery_6.jpg" /></td>
<td><img src="gallery_7.jpg" /></td>
<td><img src="gallery_8.jpg" /></td>
</tr>
</table>
<img id="frame" src="canvas_picture_frame.png" width="132" height="150" />
</body>
</html>
Ð ÑÑда какÑÑ-нибÑÐ´Ñ CSS Ð´Ð»Ñ ÑкÑаÑениÑ:
body {
background: 0 -100px repeat-x url(bg_gallery.png) #4f191a;
margin: 10px;
}
img {
display: none;
}
table {
margin: 0 auto;
}
td {
padding: 15px;
}
СвÑзÑÐ²Ð°Ñ Ð²Ñе вмеÑÑе JavaScript ÑиÑÑÐµÑ Ð½Ð°Ñи изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑÐ°Ð¼ÐºÐ°Ñ :
function draw() {
// Цикл по вÑем изобÑажениÑм
for (var i = 0; i < document.images.length; i++) {
// Ðе добавлÑÐµÑ canvas Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñамки
if (document.images[i].getAttribute("id") != "frame") {
// СоздаÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ canvas
var canvas = document.createElement("canvas");
canvas.setAttribute("width", 132);
canvas.setAttribute("height", 150);
// ÐÑÑавлÑÐµÑ Ð¿ÐµÑед изобÑажением
document.images[i].parentNode.insertBefore(canvas, document.images[i]);
var ctx = canvas.getContext("2d");
// РиÑÑÐµÑ Ð¸Ð·Ð¾Ð±Ñажение в canvas
ctx.drawImage(document.images[i], 15, 20);
// ÐобавлÑÐµÑ ÑамкÑ
ctx.drawImage(document.getElementById("frame"), 0, 0);
}
}
}
ÐонÑÑÐ¾Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÑазмеÑов изобÑажениÑ
Ðак бÑло оÑмеÑено Ñанее, изменение ÑазмеÑов изобÑажений Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑазмÑÑоÑÑи или к ÑÑÐ¼Ñ Ð² пÑоÑеÑÑе пÑеобÑазованиÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÐºÐ¾Ð½ÑекÑÑ ÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ imageSmoothingEnabled ÑвойÑÑва, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÑÑолиÑоваÑÑ Ð¸ÑполÑзование ÑглаживаÑÑего алгоÑиÑма, когда изменÑÑÑиеÑÑ Ð¸Ð·Ð¾Ð±ÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² ваÑем конÑекÑÑе. ÐбÑÑно ÑÑо ÑвойÑÑво ÑÑÑановлено в true, ознаÑаÑ, ÑÑо изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ ÑÐ³Ð»Ð°Ð¶ÐµÐ½Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑов. ÐÑ Ð¼Ð¾Ð¶ÐµÑе оÑклÑÑиÑÑ ÑÑо ÑвойÑÑво Ñак:
ctx.mozImageSmoothingEnabled = false;
ctx.webkitImageSmoothingEnabled = false;
ctx.msImageSmoothingEnabled = false;
ctx.imageSmoothingEnabled = false;