GDライブラリの使い方まとめ---2
前回の記事からの続きです。 GD ライブラリはさまざまな方法で使用できます。もちろん、以前の検証コードやウォーターマークに加えて、画像の拡大縮小、トリミング、回転などの操作も実行できます。アプリケーション。
1. 透かしを追加します
すでにご存知のとおり、imagechar または imagestring を使用して画像上に文字または文字列 (漢字も) を描画して、透かしの目的を達成できます。方法は、文字のウォーターマークを追加するだけでなく、画像のウォーターマークも追加することです: imagecopy。
プロトタイプ: bool imagecopy (resource $dst_im 、 resource $src_im 、 int $dst_x 、 int $dst_y 、 int $src_x 、 int $src_y 、 int $src_w 、 int $src_h )。これはコピーであるため、ウォーターマークを追加する場合、最初と 2 番目のパラメーターはそれぞれターゲット画像ハンドルとソース ファイル ハンドルです。ウォーターマーク画像が小さい画像であり、大きい画像に追加される場合、最初のパラメーターは全体像ハンドル、2 番目のパラメータはサムネイル ハンドルです。 3 番目と 4 番目のパラメータは、ターゲット画像上のウォーターマークの x 座標値と y 座標値です。 5 番目と 6 番目のパラメータは、ウォーターマーク画像の開始 x 座標値と y 座標値です。ウォーターマーク画像 src_im の幅と高さ。このメソッドの意味は、ウォーターマーク画像 src_im の左上隅の頂点座標 (src_x, src_y) をコピーすることです。幅と高さは次のとおりです。 src_w、src_h をそれぞれ dst_im イメージにコピーし、この dst_im イメージをキャンバスに描画して保存または出力すると、透かし入りの画像になります。 コード:
<?<span style="color: #000000;">php date_default_timezone_set(</span>'Asia/Shanghai'<span style="color: #000000;">); </span><span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加水印,文字、图片水印,以图片为例</span> <span style="color: #0000ff;">function</span> watermark(<span style="color: #800080;">$srcFile</span> = '', <span style="color: #800080;">$markFile</span> = '', <span style="color: #800080;">$dstFile</span> = ''<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(!<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$srcFile</span>) || !<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$markFile</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">echo</span> 'file not exists!<br/>'<span style="color: #000000;">; </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取原始图片与水印图片的宽高</span> <span style="color: #0000ff;">list</span>(<span style="color: #800080;">$srcWidth</span>, <span style="color: #800080;">$srcHeight</span>) = <span style="color: #008080;">getimagesize</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$markWidth</span>, <span style="color: #800080;">$markHeight</span>) = <span style="color: #008080;">getimagesize</span>(<span style="color: #800080;">$markFile</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 水印图片不能比原始图片像素还大</span> <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$markWidth</span> > <span style="color: #800080;">$srcWidth</span> || <span style="color: #800080;">$markHeight</span> > <span style="color: #800080;">$srcHeight</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取即将被加水印的原始图片句柄、水印图片句柄</span> <span style="color: #800080;">$dstImg</span> = imagecreatefromjpeg(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #800080;">$markImg</span> = imagecreatefrompng(<span style="color: #800080;">$markFile</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加水印的位置,简单放在右下角</span> <span style="color: #800080;">$dst_x</span> = <span style="color: #800080;">$srcWidth</span> - <span style="color: #800080;">$markWidth</span><span style="color: #000000;">; </span><span style="color: #800080;">$dst_y</span> = <span style="color: #800080;">$srcHeight</span> - <span style="color: #800080;">$markHeight</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取文件信息</span> <span style="color: #800080;">$fileinfo</span> = <span style="color: #008080;">pathinfo</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$dstFile</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$dstFile</span> = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$fileinfo</span>['dirname'], DS).DS.'mark_'.<span style="color: #800080;">$fileinfo</span>['filename'].<span style="color: #008080;">date</span>('YmdHis').<span style="color: #008080;">mt_rand</span>(1, 1000).'.jpeg'<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 将水印图片复制到已有图片上</span> imagecopy(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$markImg</span>, <span style="color: #800080;">$dst_x</span>, <span style="color: #800080;">$dst_y</span>, 0, 0, <span style="color: #800080;">$srcWidth</span>, <span style="color: #800080;">$srcHeight</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 将新加完水印的图片保存起来</span> imagejpeg(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$dstFile</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$dstImg</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$markImg</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">; } </span><span style="color: #800080;">$srcFile</span> = 'G:\wamp\www\html\image\p125.jpg'; <span style="color: #008000;">//</span><span style="color: #008000;"> 原图片</span> <span style="color: #800080;">$markFile</span> = 'G:\wamp\www\html\image\ooopic_5.png'; <span style="color: #008000;">//</span><span style="color: #008000;"> 水印图片</span> watermark(<span style="color: #800080;">$srcFile</span>, <span style="color: #800080;">$markFile</span>);
効果:
ここでは、画像の右下隅に透かし画像を配置するだけなので、画像の右下隅に配置するには、imagecopy を呼び出すときに簡単な計算が必要です。透かし画像の左上隅の頂点 (座標 0,0) からすべての透かし (画像の幅と高さ) を渡し、透かしを入れる画像にコピーしてから、imagejpeg が画像を描画して保存します。 imagejpeg などの描画関数 (ここでは単にそれを使用します) が 2 番目のパラメーターに渡される場合、画像はブラウザー プロセッサーに出力されるのではなくファイルとして保存されるため、送信するためにヘッダー関数を調整する必要がないことに注意してください。ヘッダー情報。
もちろん、どちらがソース ファイル (src) でどちらがターゲット ファイル (dst) であるかを把握する必要もあります。大きい画像に小さい画像を追加する場合、ソース ファイルは小さい画像です。透かしを入れてコピーします。 全体像では、全体像が目標です。
画像を透かしとして使用できます。 imagecopy の 2 番目のパラメータは画像ハンドルなので、既存の画像 (imagecreatefromjpeg など) から作成することもできます。既存の文字 --- imagecreatefromstring メソッドを使用するため、これはより一般的です。
2. 画像の拡大縮小
多くのアプリケーションでは、画像リストは小さな画像ですが、特定の画像をクリックすると、完全な大きな画像が表示されます。これには画像の処理が必要です。収縮。 imagecopyresize と imagecopyresampled の 2 つの方法があり、どちらもほぼ同じです。違いは、後者の方が画像をリサンプリングするため (私の専門用語のようです)、画質が向上します (リサンプリングもどちらの方法が使用されるかによって異なります)。いくつかのメソッドはさらに悪化します)、1 つを選んで次のように言います:
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $ dst_w , int $dst_h , int $src_w , int $src_h )
最初と 2 番目のパラメーターは上記と同様です。たとえば、ここでは、元の画像の左上隅の頂点にある、座標 (src_x, src_y)、幅と高さ src_w、src_h の画像の一部が、座標 (dst_x, dst_y) のターゲット画像に描画されます。 widthとheightはdst_w、dst_hに置きますので、対象画像の幅と高さが元の画像の選択部分の幅と高さより小さい場合は、当然縮小版の座標値になります。左上隅の 2 つの頂点は同じである必要があります。例として jpg タイプを取り上げます。
<?<span style="color: #000000;">php date_default_timezone_set(</span>'Asia/Shanghai'<span style="color: #000000;">); </span><span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 缩小图片</span> <span style="color: #008000;">/*</span><span style="color: #008000;">* * @param src 原图像路径 * @param percent 缩小比例 * @param dstFile 保存图片的路径 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">function</span> zoomPic(<span style="color: #800080;">$srcFile</span> = '', <span style="color: #800080;">$percent</span> = 0.5, <span style="color: #800080;">$dstFile</span> = ''<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(!<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$width</span>, <span style="color: #800080;">$height</span>) = <span style="color: #008080;">getimagesize</span>(<span style="color: #800080;">$srcFile</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 获取宽高</span> (<span style="color: #800080;">$percent</span> <= 0 || <span style="color: #800080;">$percent</span> > 1) && <span style="color: #800080;">$percent</span> = 0.5<span style="color: #000000;">; </span><span style="color: #800080;">$newWidth</span> = <span style="color: #008080;">floor</span>(<span style="color: #800080;">$width</span> * <span style="color: #800080;">$percent</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 缩小后的宽高</span> <span style="color: #800080;">$newHeight</span> = <span style="color: #008080;">floor</span>(<span style="color: #800080;">$height</span> * <span style="color: #800080;">$percent</span><span style="color: #000000;">); </span><span style="color: #800080;">$dstImg</span> = imagecreatetruecolor(<span style="color: #800080;">$newWidth</span>, <span style="color: #800080;">$newHeight</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 创建新图像宽高的画布</span> <span style="color: #800080;">$srcImg</span> = imagecreatefromjpeg(<span style="color: #800080;">$srcFile</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 从原图像文件创建画布</span> <span style="color: #800080;">$pathinfo</span> = <span style="color: #008080;">pathinfo</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>(!<span style="color: #800080;">$dstFile</span>) <span style="color: #800080;">$dstFile</span> = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$pathinfo</span>['dirname'], DS).DS.'zoom_'.<span style="color: #800080;">$pathinfo</span>['filename'].<span style="color: #008080;">date</span>('YmdHis').<span style="color: #008080;">mt_rand</span>(1, 1000).".jpeg"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 从源文件左上角顶点开始进行缩小 //imagecopyresized($dstImg, $srcImg, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); </span> imagecopyresampled(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$srcImg</span>, 0, 0, 0, 0, <span style="color: #800080;">$newWidth</span>, <span style="color: #800080;">$newHeight</span>, <span style="color: #800080;">$width</span>, <span style="color: #800080;">$height</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 绘制且保存图像</span> imagejpeg(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$dstFile</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 销毁资源</span> imagedestroy(<span style="color: #800080;">$dstImg</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$srcImg</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试</span> <span style="color: #800080;">$srcFile</span> = 'G:\wamp\www\html\image\p179.jpg'<span style="color: #000000;">; zoomPic(</span><span style="color: #800080;">$srcFile</span>);
効果: 元の画像を確認して表示します。
3. 画像のトリミング 上記の imagecopyresampled メソッドを元の画像の左上隅から開始せず、左上隅から右下隅まで開始する場合を考えます。切り取ったイメージの幅と高さも異なりますが、部分的な幅と高さはソース ファイルの一部となり、次のような効果が得られます。トリミングのため、トリミングとスケーリングに使用される方法は同じです<?<span style="color: #000000;">php date_default_timezone_set(</span>'Asia/Shanghai'<span style="color: #000000;">); </span><span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR); </span><span style="color: #008000;">//</span><span style="color: #008000;"> cut a picture</span> <span style="color: #0000ff;">function</span> cutPic(<span style="color: #800080;">$srcFile</span> = '', <span style="color: #800080;">$x</span> = 0, <span style="color: #800080;">$y</span> = 0, <span style="color: #800080;">$width</span> = 16, <span style="color: #800080;">$height</span> = 16, <span style="color: #800080;">$dstFile</span> = ''<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(!<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$srcWidth</span>, <span style="color: #800080;">$srcHeight</span>, <span style="color: #800080;">$type</span>) = <span style="color: #008080;">getimagesize</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #800080;">$x</span> < 0 && <span style="color: #800080;">$x</span> = 0<span style="color: #000000;">; </span><span style="color: #800080;">$y</span> < 0 && <span style="color: #800080;">$y</span> = 0<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 宽高设置</span> ((<span style="color: #800080;">$width</span> + <span style="color: #800080;">$x</span>) > <span style="color: #800080;">$srcWidth</span>) && <span style="color: #800080;">$width</span> = <span style="color: #800080;">$srcWidth</span><span style="color: #000000;">; ((</span><span style="color: #800080;">$height</span> + <span style="color: #800080;">$y</span>) > <span style="color: #800080;">$srcHeight</span>) && <span style="color: #800080;">$height</span> = <span style="color: #800080;">$srcHeight</span><span style="color: #000000;">; (</span><span style="color: #800080;">$width</span> <= 0) && <span style="color: #800080;">$width</span> = <span style="color: #800080;">$srcWidth</span><span style="color: #000000;">; (</span><span style="color: #800080;">$height</span> <= 0) && <span style="color: #800080;">$height</span> = <span style="color: #800080;">$srcHeight</span><span style="color: #000000;">; </span><span style="color: #800080;">$dstImg</span> = imagecreatetruecolor(<span style="color: #800080;">$width</span>, <span style="color: #800080;">$height</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 目标文件资源 </span> <span style="color: #0000ff;">switch</span>(<span style="color: #800080;">$type</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">case</span> IMG_GIF: <span style="color: #800080;">$srcImg</span> = imagecreatefromgif(<span style="color: #800080;">$srcFile</span>); <span style="color: #008000;">//</span><span style="color: #008000;"> 获取源文件资源句柄及扩展名处理,以使用合适的函数和扩展</span> <span style="color: #800080;">$ext</span> = 'gif'<span style="color: #000000;">; </span><span style="color: #800080;">$imagefun</span> = 'imagegif'<span style="color: #000000;">; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #0000ff;">case</span> IMG_JPG: <span style="color: #800080;">$srcImg</span> = imagecreatefromjpeg(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #800080;">$ext</span> = 'jpeg'<span style="color: #000000;">; </span><span style="color: #800080;">$imagefun</span> = 'imagejpeg'<span style="color: #000000;">; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; </span><span style="color: #0000ff;">default</span>: <span style="color: #800080;">$srcImg</span> = imagecreatefrompng(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #800080;">$ext</span> = 'png'<span style="color: #000000;">; </span><span style="color: #800080;">$imagefun</span> = 'imagepng'<span style="color: #000000;">; </span><span style="color: #0000ff;">break</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置保存剪切后的文件路径</span> <span style="color: #800080;">$fileinfo</span> = <span style="color: #008080;">pathinfo</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$dstFile</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$dstFile</span> = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$fileinfo</span>['dirname'], DS).DS.'cut_'.<span style="color: #800080;">$fileinfo</span>['filename'].<span style="color: #008080;">date</span>('YmdHis').<span style="color: #008080;">mt_rand</span>(1, 1000).".{<span style="color: #800080;">$ext</span>}"<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 执行剪切操作</span> imagecopyresampled(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$srcImg</span>, 0, 0, <span style="color: #800080;">$x</span>, <span style="color: #800080;">$y</span>, <span style="color: #800080;">$width</span>, <span style="color: #800080;">$height</span>, <span style="color: #800080;">$width</span>, <span style="color: #800080;">$height</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 画于画布并保存文件</span> <span style="color: #800080;">$imagefun</span>(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$dstFile</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$dstImg</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$srcImg</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试</span> <span style="color: #800080;">$srcFile</span> = 'G:\wamp\www\html\image\p221.jpg'<span style="color: #000000;">; cutPic(</span><span style="color: #800080;">$srcFile</span>, 50, 50, 50, 50);
4.画像回転
图片旋转也十分常见,主要用到函数imagerotate,原型:resource imagerotate ( resource $image , float $angle , int $bgd_color [, int $ignore_transparent = 0 ] ),第一个参数是待旋转图像句柄,第二个参数angle 是旋转的角度数值,第三个参数指定一个颜色,即当旋转后出现空的地方是使用哪种颜色填充,第四个参数是指定一个透明色,默认0表示保留透明色。该方法返回一个新的图像句柄,就是经过旋转后的图像资源变量,将它绘制保存即可。还要注意的是,旋转的角度可以指定0到360之间,为逆时针旋转,以jpg为例:
<?<span style="max-width:90%">php date_default_timezone_set(</span>'Asia/Shanghai'<span style="color: #000000;">); </span><span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR); </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * 图片旋转 * @param angular 旋转角度值 0-360 </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">function</span> rotatePic(<span style="color: #800080;">$srcFile</span> = '', <span style="color: #800080;">$angular</span> = 0, <span style="color: #800080;">$dstFile</span> = ''<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(!<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">echo</span> 'file not exists<br/>'<span style="color: #000000;">; </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #800080;">$srcImg</span> = imagecreatefromjpeg(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 处理保存文件地址</span> <span style="color: #800080;">$fileinfo</span> = <span style="color: #008080;">pathinfo</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$dstFile</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$dstFile</span> = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$fileinfo</span>['dirname'], DS).DS.'rotate_'.<span style="color: #800080;">$fileinfo</span>['filename'].<span style="color: #008080;">date</span>('YmdHis').<span style="color: #008080;">mt_rand</span>(1, 1000).'.jpeg'<span style="color: #000000;">; } </span><span style="color: #800080;">$white</span> = imagecolorallocate(<span style="color: #800080;">$srcImg</span>, 0xff, 0xff, 0xf1<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 执行旋转,注意是逆时针方向</span> <span style="color: #800080;">$dstImg</span> = imagerotate(<span style="color: #800080;">$srcImg</span>, <span style="color: #800080;">$angular</span>, <span style="color: #800080;">$white</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 画到画布,保存文件</span> imagejpeg(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$dstFile</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$dstImg</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$srcImg</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试</span> <span style="color: #800080;">$srcFile</span> = 'G:\wamp\www\html\image\p219.jpg'<span style="color: #000000;">; rotatePic(</span><span style="color: #800080;">$srcFile</span>, 220);
效果:原图 旋转后
5. 图片翻转
这个在应用中不那么常见。所谓翻转,就是对图像进行镜面翻转,比如以图片中间竖直线为轴线,左边换到右边,右边换到左边,对调一下位置,就是左右翻转。想象一下,以中间竖直线为对称轴的情况,Y轴像素点不变,X轴上的像素点左右对调,仍可以使用imagecopy方法,对于源文件,在复制到目标图像时,进行这个操作,以绕Y轴旋转,jpg类型图片为例
<?<span style="color: #000000;">php </span><span style="color: #008000;">//</span><span style="color: #008000;"> 图片翻转</span> date_default_timezone_set('Asia/Shanghai'<span style="color: #000000;">); </span><span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 沿Y轴翻转,x坐标值对调</span> <span style="color: #0000ff;">function</span> turnY(<span style="color: #800080;">$srcFile</span> = '', <span style="color: #800080;">$dstFile</span> = ''<span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(!<span style="color: #008080;">file_exists</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">)) { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 原图像句柄和宽高获取</span> <span style="color: #800080;">$srcImg</span> = imagecreatefromjpeg(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #800080;">$srcWidth</span> = imagesx(<span style="color: #800080;">$srcImg</span><span style="color: #000000;">); </span><span style="color: #800080;">$srcHeight</span> = imagesy(<span style="color: #800080;">$srcImg</span><span style="color: #000000;">); </span><span style="color: #800080;">$dstImg</span> = imagecreatetruecolor(<span style="color: #800080;">$srcWidth</span>, <span style="color: #800080;">$srcHeight</span><span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 沿Y轴翻转,x轴上的像素点左右对调</span> <span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$srcWidth</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;">) { imagecopy(</span><span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$srcImg</span>, <span style="color: #800080;">$srcWidth</span>-<span style="color: #800080;">$i</span>-1, 0, <span style="color: #800080;">$i</span>, 0, 1, <span style="color: #800080;">$srcHeight</span><span style="color: #000000;">); } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 画像保存路径处理</span> <span style="color: #800080;">$fileinfo</span> = <span style="color: #008080;">pathinfo</span>(<span style="color: #800080;">$srcFile</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$dstFile</span><span style="color: #000000;">)) { </span><span style="color: #800080;">$dstFile</span> = <span style="color: #008080;">rtrim</span>(<span style="color: #800080;">$fileinfo</span>['dirname'], DS).DS.'turnx_'.<span style="color: #800080;">$fileinfo</span>['filename'].<span style="color: #008080;">date</span>('YmdHis').<span style="color: #008080;">mt_rand</span>(1, 1000).'.jpeg'<span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 绘制图像,保存文件</span> imagejpeg(<span style="color: #800080;">$dstImg</span>, <span style="color: #800080;">$dstFile</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$dstImg</span><span style="color: #000000;">); imagedestroy(</span><span style="color: #800080;">$srcImg</span><span style="color: #000000;">); </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">; } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试</span> <span style="color: #800080;">$srcFile</span> = 'G:\wamp\www\html\image\p311.jpg'<span style="color: #000000;">; turnY(</span><span style="color: #800080;">$srcFile</span>);
效果: 翻转前 翻转后
主要就是for循环那儿,得到源文件的宽度$srcWidth后,如果源文件上坐标是($i, 0)则对应目标图像上坐标($srcWidth-$i-1, 0),然后将宽度为1个像素,高为源文件整个高度$srcHeight的资源复制过去,循环完成后就全部复制到一个图片上了,相当于是一条一条线的画过去的。
无意浏览手册感觉被坑,看到imageflip函数猜到是这个功能,一看果然是的,可是看的书已经落后几年了,原型:bool imageflip ( resource $image , int $mode ),第一个参数是目标图像资源,第二个参数是翻转的方式,使用php自带的枚举变量即可,有IMG_FLIP_HORIZONTAL(水平)、IMG_FLIP_HORIZONTAL(竖直)、IMG_FLIP_BOTH(水平竖直)三种方式,一个函数即可实现。
反正都挺简单,不如练练手玩玩 :-D