웹 프론트엔드 HTML 튜토리얼 Canvas入门(3):图像处理和绘制文字_html/css_WEB-ITnose

Canvas入门(3):图像处理和绘制文字_html/css_WEB-ITnose

Jun 24, 2016 am 11:56 AM

来源:http://www.ido321.com/997.html

一、图像处理(非特别说明,所有结果均来自最新版Google)

在HTML 5中,不仅可以使用Canvas API绘制图形,也可以用于处理网络或磁盘中的图像文件,然后绘制在画布中。绘制图像时,需要使用drawImage()方法:

drawImage(image,x,y):image是图像引用,x,y是绘制图像时在画布中的起始位置

drawImage(image,x,y,w,h):前三个同上,w,h是绘制时图像的宽度和高度,可以用于缩放图像

drawImage(image,sx,sy,sw,sh,dx,dy,dw.dh): 将画布中已经绘制好的图像的全部或者局部复制到画布的另一个位置。sx,sy,sw,sh分别是原图中被复制区域的起始位置宽高,dx,dy,dw,dh 表示复制后图像在画布中的起始位置和高宽。

   1: // 获取canvas 的ID
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   2: var canvas = document.getElementById('canvas');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   3: if (canvas == null)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   4: {
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   5: return false;
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   6: }
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   7: // 获取上下文
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   8: var context = canvas.getContext('2d');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   9: context.fillStyle = '#eeeeff';
로그인 후 복사
로그인 후 복사
  10: context.fillRect(0,0,400,300);
로그인 후 복사
로그인 후 복사
  11: var image = new Image();
로그인 후 복사
로그인 후 복사

12: image.src = ‘my.jpg’;

// onload事件实现边绘制边加载

  13: image.onload = function()
로그인 후 복사
  14: {
로그인 후 복사
  15: drawImage(context,image);
로그인 후 복사
  16: };
로그인 후 복사
  17: function drawImage(context,image)
로그인 후 복사
  18: {
로그인 후 복사
  19: for (var i = 0; i < 7; i++) {
로그인 후 복사
  20: context.drawImage(image,0+i*50,0+i*25,100,100);
로그인 후 복사
  21: };
로그인 후 복사
로그인 후 복사
  22: }
로그인 후 복사

效果:

1、图像平铺

   1: // 获取canvas 的ID
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   2: var canvas = document.getElementById('canvas');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   3: if (canvas == null)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   4: {
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   5: return false;
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   6: }
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   7: // 获取上下文
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   8: var context = canvas.getContext('2d');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   9: context.fillStyle = '#eeeeff';
로그인 후 복사
로그인 후 복사
  10: context.fillRect(0,0,400,300);
로그인 후 복사
로그인 후 복사
  11: var image = new Image();
로그인 후 복사
로그인 후 복사
  12: image.src = 'my.jpg';
로그인 후 복사
  13: // onload事件实现边绘制边加载
로그인 후 복사
  14: image.onload = function()
로그인 후 복사
  15: {
로그인 후 복사
  16: drawImage(canvas,context,image);
로그인 후 복사
  17: };
로그인 후 복사
  18: function drawImage(canvas,context,image)
로그인 후 복사
  19: {
로그인 후 복사
로그인 후 복사
  20: // 平铺比例
로그인 후 복사
  21: var scale = 5;
로그인 후 복사
  22: // 缩小图像后宽度
로그인 후 복사
  23: var n1 = image.width / scale;
로그인 후 복사
  24: // 缩小图像后高度
로그인 후 복사
  25: var n2 = image.height / scale;
로그인 후 복사
  26: // 横向平铺个数
로그인 후 복사
  27: var n3 = canvas.width / n1;
로그인 후 복사
  28: // 纵向平铺个数
로그인 후 복사
  29: var n4 = canvas.height / n2;
로그인 후 복사
  30: for(var i = 0; i < n3; i++)
로그인 후 복사
  31: {
로그인 후 복사
  32: for(var j=0; j < n4; j++)
로그인 후 복사
  33: {
로그인 후 복사
  34: context.drawImage(image,i*n1,j*n2,n1,n2);
로그인 후 복사
  35: }
로그인 후 복사
  36: }
로그인 후 복사
  37: }
로그인 후 복사

效果:

在HTML 5中,利用context.createPattern(image,type)也可以实现平铺,type取值同background-image的平铺值一样。

   1: image.onload = function()
로그인 후 복사
   2: {
로그인 후 복사
   3: // drawImage(canvas,context,image);
로그인 후 복사
   4: var ptrn = context.createPattern(image,'repeat');
로그인 후 복사
   5: context.fillStyle = ptrn;
로그인 후 복사
   6: context.fillRect(0,0,400,300);
로그인 후 복사
   7: };
로그인 후 복사

能同样实现平铺(图片没有缩放,所以是原图大小平铺)

2、图像裁剪

   1: // 获取canvas 的ID
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   2: var canvas = document.getElementById('canvas');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   3: if (canvas == null)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   4: {
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   5: return false;
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   6: }
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   7: // 获取上下文
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   8: var context = canvas.getContext('2d');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   9: // 获取渐变对象
로그인 후 복사
  10: var g1 = context.createLinearGradient(0,400,300,0);
로그인 후 복사
  11: // 添加渐变颜色
로그인 후 복사
  12: g1.addColorStop(0,'rgb(255,255,0)');
로그인 후 복사
  13: g1.addColorStop(1,'rgb(0,255,255)');
로그인 후 복사
  14: context.fillStyle = g1;
로그인 후 복사
  15: context.fillRect(0,0,400,300);
로그인 후 복사
  16: var image = new Image();
로그인 후 복사
  17: // onload事件实现边绘制边加载
로그인 후 복사
  18: image.onload = function()
로그인 후 복사
  19: {
로그인 후 복사
로그인 후 복사
  20: drawImage(context,image);
로그인 후 복사
  21: };
로그인 후 복사
로그인 후 복사
  22: image.src = 'my.jpg';
로그인 후 복사
  23: function drawImage(context,image)
로그인 후 복사
  24: {
로그인 후 복사
  25: create5StarClip(context);
로그인 후 복사
  26: context.drawImage(image,-50,-150,300,300);
로그인 후 복사
  27: }
로그인 후 복사
  28: function create5StarClip(context)
로그인 후 복사
  29: {
로그인 후 복사
  30: var dx = 100;
로그인 후 복사
  31: var dy = 0;
로그인 후 복사
  32: var s = 150;
로그인 후 복사
  33: // 创建路径
로그인 후 복사
  34: context.beginPath();
로그인 후 복사
  35: context.translate(100,150);
로그인 후 복사
  36: var x = Math.sin(0);
로그인 후 복사
  37: var y = Math.cos(0);
로그인 후 복사
  38: var dig = Math.PI/5 *4;
로그인 후 복사
  39: // context.moveTo(dx,dy);
로그인 후 복사
  40: for (var i = 0; i < 5; i++) {
로그인 후 복사
  41: var x = Math.sin(i * dig);
로그인 후 복사
  42: var y = Math.cos(i * dig);
로그인 후 복사
  43: context.lineTo(dx+x*s,dy+y*s);
로그인 후 복사
  44: }
로그인 후 복사
  45: context.clip();
로그인 후 복사
  46: }
로그인 후 복사

效果:

3、像素处理

   1: // 获取canvas 的ID
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   2: var canvas = document.getElementById('canvas');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   3: if (canvas == null)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   4: {
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   5: return false;
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   6: }
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   7: // 获取上下文
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   8: var context = canvas.getContext('2d');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   9: var image = new Image();
로그인 후 복사
  10: image.src = 'my.jpg';
로그인 후 복사
  11: // onload事件实现边绘制边加载
로그인 후 복사
  12: image.onload = function()
로그인 후 복사
  13: {
로그인 후 복사
  14: context.drawImage(image,0,0);
로그인 후 복사
  15: // 获取原图像素
로그인 후 복사
  16: var imageData = context.getImageData(0,0,image.width,image.height);
로그인 후 복사
  17: for (var i = 0,n= imageData.data.length; i <n; i += 4) {
로그인 후 복사
  18: // red
로그인 후 복사
  19: imageData.data[i+0] = 255-imageData.data[i+0];
로그인 후 복사
  20: // green
로그인 후 복사
  21: imageData.data[i+1] = 255-imageData.data[i+2];
로그인 후 복사
  22: // blue
로그인 후 복사
  23: imageData.data[i+2] = 255-imageData.data[i+1];
로그인 후 복사
  24: };
로그인 후 복사
  25: // 将调整后的像素应用到图像
로그인 후 복사
  26: context.putImageData(imageData,0,0);
로그인 후 복사
  27: };
로그인 후 복사

getImageData(sx,sy,sw,sh):表示获取像素区域的起始坐标和 高宽,返回一个具有width,height,data等属性CanvasPixelArray对象,其中data属性存放像素数据的数组,形如 [r1,g1,b1,a1,r2,g2,b2,a2……],r1,g1,b1,a1分别是第一个像素的红绿蓝值及透明度,以此类推。

putImageData(imagedata,dx,dy[,dirtyx,dirtyy,dirtyWidth,dirtyHeight]): 将像素数据重新绘制到图像上。imagedata是像素数组,dx,dy表示重绘的起始位置,后面四个参数是给出一个矩形的左上角坐标和高宽。

Canvas API的像素操作只有部分浏览器支持,截图效果来自新版的火狐浏览器

二、绘制文字

   1: // 获取canvas 的ID
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   2: var canvas = document.getElementById('canvas');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   3: if (canvas == null)
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   4: {
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   5: return false;
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   6: }
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   7: // 获取上下文
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   8: var context = canvas.getContext('2d');
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
   9: context.fillStyle = '#00f';
로그인 후 복사
  10: // 设置文字属性
로그인 후 복사
  11: context.font = 'italic 30px sans-serif';
로그인 후 복사
  12: context.textBaseline = 'top';
로그인 후 복사
  13: // 填充字符串
로그인 후 복사
  14: context.fillText('Canvas绘制文字',0,0);
로그인 후 복사
  15: context.font = 'bold 30px sans-serif';
로그인 후 복사
  16: // 轮廓字符串
로그인 후 복사
  17: context.strokeText('改变位置了',50,50);
로그인 후 복사

fillText(string,x,y[,maxwidth]):前三个不解释,maxwidth表示显示文字的最大宽度,可防止文字溢出

strokeText(string,x,y[,maxwidth]:同上。

文字属性设置

font:设置字体

textAlign:水平对齐方式,取值可是start/end/left/right/center.默认是start

textBaseline:垂直对齐方式,取值可是top/hanging/middle/alphabetic/ideographic/bottom.默认是alphabetic

最终效果


下一篇:9个JQuery和5个JavaScript经典面试题

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? 뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? Mar 20, 2025 pm 05:56 PM

이 기사는 모바일 장치의 반응 형 웹 디자인에 필수적인 Viewport Meta Tag에 대해 설명합니다. 적절한 사용이 최적의 컨텐츠 스케일링 및 사용자 상호 작용을 보장하는 방법을 설명하는 반면, 오용은 설계 및 접근성 문제로 이어질 수 있습니다.

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? & lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? Mar 20, 2025 pm 06:05 PM

이 기사는 & lt; iframe & gt; 외부 컨텐츠를 웹 페이지, 공통 용도, 보안 위험 및 객체 태그 및 API와 같은 대안을 포함시키는 태그의 목적.

HTML은 초보자를 위해 쉽게 배우나요? HTML은 초보자를 위해 쉽게 배우나요? Apr 07, 2025 am 12:11 AM

HTML은 간단하고 배우기 쉽고 결과를 빠르게 볼 수 있기 때문에 초보자에게 적합합니다. 1) HTML의 학습 곡선은 매끄럽고 시작하기 쉽습니다. 2) 기본 태그를 마스터하여 웹 페이지를 만들기 시작하십시오. 3) 유연성이 높고 CSS 및 JavaScript와 함께 사용할 수 있습니다. 4) 풍부한 학습 리소스와 현대 도구는 학습 과정을 지원합니다.

See all articles