做程序的开发,必然会遇到处理图片上传的问题,图片上传的功能其实很简单了,这里我要说的是GD库的使用。其实,GD库也没有我们想的那么复杂。只不过是他的函数的名字特别长,特别的多。但其实无非都是创建个资源先,先创建画布,有专门的画线、画点、画块。的函数,特殊的还可以画文字,你给他文字,和字体样式,给他位置,他自动去画,还可以画图像,将一个图片画到一个画布中。这样基本就已经可以满足我们大部分对图片处理的需要了。但是还有一个比较重要的功能,也是我们用到的最多的功能,就是截取。
所谓的截取的原理是什么,其实也是一样的道理,就是如果有一张图片是100×100,而我们想要截取一个50×50的图像,那就是先创建一个50×50的画布,然后定准图片开始截取的坐标,和结束的坐标。我们都应该知道,在程序中,图片是用坐标像素来确定的。图片左上角是(0,0)位置。右下角是其(width,height)位置。这也是和我们普通的学习的坐标的一点点区别。知道了规则就方便了,同样的图像的缩放也都是一样的道理,只是一些镂空的设计有些麻烦,因为我们知道,有些logo事需要透明设置的,通过程序的上传缩放后有肯能会将透明变为一些默认的颜色。这些以后在讲,现在就说说截取。我们以截取截取以像素用于平铺为例来讲。
首先,我们先要想一下,平铺的方式有几种,有人说两种,水平和竖直。但其实不然。如果一个图片的上下左右各不相同,那么向上平铺和向下平铺所用的图片就是不一样的,同样,向左和向右平铺的图片也是不一样的了。所以平铺的方式目前来说至少有四种。即上下左右,他们大体上的实现原理是一样的,只是其宽高和起止不同而已、但也就是这简单的不同就可能需要我们好好的研究。我们先以最常用的向右平铺为例来讲解。
这个是代码实现。我们以一个图片文件为例,当然这个图片可以是你刚刚上传后的,给他路径就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php /*这里我们以jpg格式的图片为例,不同格式的图片,有些处理函数也是不同的,不过也很容易区分,这些特殊的函数都有其后缀在函数名中*/ $filename = '1.jpg'; // 因为创建后的图片文件不会输出给浏览器而是用于保存,所以不用指定头文件。 /*获取图片的宽高,既然是向右平铺,也就是说这个截取后的图片的宽是确定的,也就是1像素,而高呢,应该是原图片的高。*/ list($width, $height) = getimagesize($filename); $newwidth = 1; $newheight = $height; // 创建一个图片。接收参数分别为宽高,返回生成的资源句柄,就是一个画布 $thumb = imagecreatetruecolor($newwidth, $newheight); /*获取源文件资源句柄。接收参数为图片路径,返回句柄,这也是画布,因为我们是不能直接操作图片文件的,需要将他画到画布中,成为资源才可以操作。*/ $source = imagecreatefromjpeg($filename);//imagecreatefromgif imagecreatefrompng /*开始截取,他的意思就是将第一个资源的规定的开始位置,结束位置,到第二个资源的定义的开始位置结束位置。所以我们这里就应该是这样*/ imagecopyresampled($source, $thumb, $width-1, 0, $width, $height,0, 0,1, $height); //保存的图片路径,要对应后缀名 $to_File = 'chao.jpg'; ImageJpeg($thumb,$to_File,100);//Imagepng Imagegif //回收资源 imagedestroy($thumb); imagedestroy($source); |
图片的操作还是挺浪费系统资源的,所以要做好资源的回收。Png,gif的图片也是一样的道理。其他方向的截取也是同理。不过也需要好好考虑。
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/120/?replytocom=976
2013年03月26日 下午 9:45 billy | 引用 | #1
感谢分享!