您好,欢迎访问一九零五行业门户网

HTML5边玩边学(五)-图像、图案和字体

一、创建图像对象
在 html5 中,image 对象对应着一幅图片,想要获取一个图像对象,有以下几种方法:
1) 通过 document.images 集合、document.getelementsbytagname 方法或者 document.getelementbyid 方法来获取网页内已经存在的图片对象;
2) 用 document.getelementsbytagname 或 document.getelementbyid 方法来获取另外一个 canvas 对象,将这个 canvas 对象作为一个图像对象;
3) 最常用的方法:创建一个新的空 image 对象,给他一个图片的超链接,代码如下:
//创建一个空图像对象 var img = new image(); //给图像对象一个图片超链接 img.src = 'myimage.png';
4) 最后一种是通过 data: url 方式嵌入图像,这种方法很奇妙,他可以用一个很长的字符串来表示一幅图像。
那么这个很长的字符串是怎么来的呢?他是把真正的图像文件(bmp jpg 等等)通过 base64 编码而来,具体的编码程序网上能搜索到很多,我博客里就有一个 python 版的。
用这种方式的好处就是,图片资源始终内嵌在 html 网页文件中,缺点是数据量太大,而且图片没办法缓存,导致网页文件打开速度变慢
下面的字符串就是一幅美女图片的 base64 编码的一小段,让大家看看是什么样子的:
/9j/4qdfrxhpzgaasukqaagaaaafabibawabaaaaaqaaadebagavaaaasgaaadibagauaaaaxw
这些乱七八糟的东西就包含了美女图片的一小部分内容了,后面我们将把它绘制到 canvas 上
二、绘制图像对象
我们得到一个图像对象后,它只是在内存中,我们怎么才能将它绘制到画布上呢? 上下文对象有一个绘制图像对象的方法:
drawimage(image, x, y)
简单吧?image 就是你事先准备好的图像对象,x, y 就是图像左上角放置的位置 ,这个方法调用后,你的图像就会出现在 canvas 上了
下面我们来把上面的美女图像绘制出来,代码如下:
代码 code highlighting produced by actipro codehighlighter (freeware) http://www.codehighlighter.com/ --><canvas id="canvas1" width="250" height="300" style="background-color:black"> 你的浏览器不支持 &lt;canvas&gt;标签,请使用 chrome 浏览器 或者 firefox 浏览器 </canvas><br/> <input type="button" value="显示美女" onclick="show();" /> <input type="button" value="清空" onclick="clear();" /> <script type="text/javascript"> //美女图的 base64 编码 img_src='data:image/gif;base64,/9j/4qdfrxhpzgaasukqaagaaaa......'//省略40字节 //缩小版本的美女图 img_src_small='data:image/gif;base64,/9j/4qdfrxhpzgaasukqaagaaaa......'//省略40字节 function show(){ //获取画布对象 ctx = document.getelementbyid("canvas1").getcontext("2d"); //创建图像对象 img=new image(); //图像被装入后触发 img.onload=function(){ ctx.drawimage(img,0,0); } //指定图像源 img.src=img_src; } function clear(){ //清除画布 ctx = document.getelementbyid("canvas1").getcontext("2d"); ctx.clearrect(0,0,250,300); } </script>
注意:把绘制方法放到图像对象的 onload 事件中,是为了确保图像在完全装入后才绘制
三、缩放图像
同样的 imagedraw 方法,增加两个参数,就可以对图像实现缩放,如下:
drawimage(image, x, y, width, height)
width 代表你想将图像绘制成多宽,height 代表你想将图像绘制成多高,设定好后系统会自动按比例进行缩放。
下面的例子我们来模仿一个常见的图像软件的小功能,通过拖动滑动条对图像进行缩放,代码如下:
代码 code highlighting produced by actipro codehighlighter (freeware) http://www.codehighlighter.com/ --><canvas id="canvas2" width="250" height="300" style="background-color:black"> 你的浏览器不支持 &lt;canvas&gt;标签,请使用 chrome 浏览器 或者 firefox 浏览器 </canvas><br/> 注意:下面的 range 控件只能在 google chrome 浏览器中正确呈现 横向缩放<input type="range" min="1" max="20" onchange="scale1(event)"/><br/> 纵向缩放<input type="range" min="1" max="20" onchange="scale2(event)"/><br/> 按比例缩放<input type="range" min="1" max="20" onchange="scale3(event)"/><br/> 平铺<input type="range" min="1" max="10" value="1" onchange="scale4(event)"/><br/> <script type="text/javascript"> function scale1(){ //计算比例 var scale=event.target.value/10 ///获取画布对象 ctx = document.getelementbyid("canvas2").getcontext("2d"); //清空 ctx.clearrect(0,0,250,300); //创建图像对象 img=new image(); //图像被装入后触发 img.onload=function(){ //横向缩放绘制 ctx.drawimage(img,0,0,img.width*scale,img.height); } //指定图像源 img.src=img_src; } function scale2(){ //计算比例 var scale=event.target.value/10 ///获取画布对象 ctx = document.getelementbyid("canvas2").getcontext("2d"); //清空 ctx.clearrect(0,0,250,300); //创建图像对象 img=new image(); //图像被装入后触发 img.onload=function(){ //纵向缩放绘制 ctx.drawimage(img,0,0,img.width,img.height*scale); } //指定图像源 img.src=img_src; } function scale3(){ //计算比例 var scale=event.target.value/10 ///获取画布对象 ctx = document.getelementbyid("canvas2").getcontext("2d"); //清空 ctx.clearrect(0,0,250,300); //创建图像对象 img=new image(); //图像被装入后触发 img.onload=function(){ //按比例缩放绘制 ctx.drawimage(img,0,0,img.width*scale,img.height*scale); } //指定图像源 img.src=img_src; } function scale4(){ //平铺比例 var scale=event.target.value; ///获取画布对象 ctx = document.getelementbyid("canvas2").getcontext("2d"); //清空 ctx.clearrect(0,0,250,300); //创建图像对象 img=new image(); //图像被装入后触发 img.onload=function(){ //平铺个数 var n1=img.width/scale; var n2=img.height/scale; for(var i=0;i<n1;i++) for(var j=0;j<n2;j++) ctx.drawimage(img,i*img.width/scale,j*img.height/scale,img.width/scale,img.height/scale); } //指定图像源 img.src=img_src; } </script>
横向缩放
纵向缩放
按比例缩放
平铺
提示:
只有在 google chrome 浏览器中,range 控件才能呈现出滑动条的的样子并正确工作;
在其他浏览器中,您可能只能看到四个文本框,并且无法正常工作
四、裁剪图像
图像裁剪同样是使用 imagedraw 方法,原型如下:
drawimage(image, sx, sy, swidth, sheight, dx, dy, dwidth, dheight),其中
sx, sy 是图像上的一个坐标位置,这个坐标是裁剪的起始点
swidth, sheight 是裁剪的宽度和长度
有了这四个参数,我们就可以将图像上的任意区域裁剪出来了
另外
dx, dy 是画布上的一个坐标为止,裁剪出来的图像的左上角将放置在这个位置
dwidth, dheight 是设置裁剪出来的图像绘制成多长和多宽,可以缩放
裁剪图像比较简单,就不给例子了
五、图案
在上面的图像缩放中,我们用循环的方法实现了图像的平铺,其实还有更方便的方法,就是用图案对象填充画布,图案对象用下面的方法创建:
createpattern(image,type)
其中,type 必须是下面的字符串值之一:repeat,repeat-x,repeat-y 和 no-repeat。
得到图案对象后,可以将其设置给上下文对象的 fillstyle 属性,然后再填充画布,就可以看到重复填充的效果了。
下面的代码中,我们将把缩小版本的美女图用 repeat 模式,平铺到画布上:
图案 code highlighting produced by actipro codehighlighter (freeware) http://www.codehighlighter.com/ --><canvas id="canvas3" width="250" height="300" style="background-color:black"> 你的浏览器不支持 &lt;canvas&gt;标签,请使用 chrome 浏览器 或者 firefox 浏览器 </canvas><br/> <input type="button" value="贴图" onclick="patterns();" /> <input type="button" value="清空" onclick="clearpatterns();" /> <script type="text/javascript"> //美女图的缩小版本 img_src_small='data:image/gif;base64,/9j/4qdfrxhpzgaasukqaagaaaafabiba......';//省略四个字节 function patterns(){ ///获取画布对象 ctx = document.getelementbyid("canvas3").getcontext("2d"); //创建图像对象 img=new image(); //指定图像源 img.src=img_src_small; //图像被装入后触发 img.onload=function(){ //创建图案 var ptrn = ctx.createpattern(img,'repeat'); //将图案设置为填充样式 ctx.fillstyle = ptrn; //填充画布 ctx.fillrect(0,0,250,300); } } function clearpatterns(){ ///获取画布对象 ctx = document.getelementbyid("canvas3").getcontext("2d"); //清空 ctx.clearrect(0,0,250,300); } </script>
六、字体
html5 的没有专门的字体对象,上下文对象中有三个属性用来设置字体,两个方法来绘制字符串,他们是:
font:文字字体,同 css font-family 属性
textalign:文字水平对齐方式。可取属性值: start, end, left, right, center。默认值: start.
textbaseline:文字竖直对齐方式。可取属性值:top, hanging, middle, alphabetic, ideographic, bottom。默认值:alphabetic.
filltext 和 stroketext:用填充方式和轮廓方式绘制字符串
下面的代码绘制两个不同设置的 hello world 字符串
代码 code highlighting produced by actipro codehighlighter (freeware) http://www.codehighlighter.com/ -->context.fillstyle = '#00f'; context.font = 'italic 30px sans-serif'; context.textbaseline = 'top'; //填充字符串 context.filltext ('hello world!', 0, 0); context.font = 'bold 30px sans-serif'; //轮廓字符串 context.stroketext('hello world!', 0, 50);
下图是上面的代码运行效果:
以上就是html5边玩边学(五)-图像、图案和字体的详细内容。
其它类似信息

推荐信息