php下用GD生成生成缩略图的两个选择和区别

PHP100 2019-03-27

PHP的GD扩展提供了两个函数来缩放图像:
<span lang="EN-US">ImageCopyResized(<tt><em>dest</em></tt>, <tt><em>src</em></tt>, <tt><em>dx</em></tt>, <tt><em>dy</em></tt>, <tt><em>sx</em></tt>, <tt><em>sy</em></tt>, <tt><em>dw</em></tt>, <tt><em>dh</em></tt>, <tt><em>sw</em></tt>, <tt><em>sh</em></tt>);<br>ImageCopyResampled(<tt><em>dest</em></tt>, <tt><em>src</em></tt>, <tt><em>dx</em></tt>, <tt><em>dy</em></tt>, <tt><em>sx</em></tt>, <tt><em>sy</em></tt>, <tt><em>dw</em></tt>, <tt><em>dh</em></tt>, <tt><em>sw</em></tt>, <tt><em>sh</em></tt>);</span> <br>
<span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"><span style="COLOR: rgb(0,0,0)"> <p><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"><span style="COLOR: rgb(0,0,0)"></span></span></span><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"><span style="COLOR: rgb(0,0,0)"></span></span></span>ImageCopyResized( )函数在所有GD版本中有效,但其缩放图像的算法比较粗糙,可能会导致图像边缘的锯齿。GD 2.x中新增了一个ImageCopyResampled( )函数,其像素插值算法得到的图像边缘比较平滑(但该函数的速度比ImageCopyResized()慢)。

来看一个例子,我们将这个图缩小四倍:
<span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,187)"><?php <br><br> $src </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">ImageCreateFromJPEG</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(221,0,0)">'php.jpg'</span><span style="COLOR: rgb(0,119,0)">); <br><br> </span><span style="COLOR: rgb(0,0,187)">$width </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">ImageSx</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$src</span><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(0,0,187)">$height </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">ImageSy</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$src</span><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(0,0,187)">$x </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">$width</span><span style="COLOR: rgb(0,119,0)">/</span><span style="COLOR: rgb(0,0,187)">2</span><span style="COLOR: rgb(0,119,0)">; </span><span style="COLOR: rgb(0,0,187)">$y </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">$height</span><span style="COLOR: rgb(0,119,0)">/</span><span style="COLOR: rgb(0,0,187)">2</span><span style="COLOR: rgb(0,119,0)">; <br> </span><span style="COLOR: rgb(0,0,187)">$dst </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">ImageCreateTrueColor</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$x</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$y</span><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(0,0,187)">ImageCopyResized</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$dst</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$src</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">0</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">0</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">0</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">0</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$x</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$y</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$width</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$height</span><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(255,128,0)">//ImageCopyResampled($dst,$src,0,0,0,0,$x,$y,$width,$height); <br><br> </span><span style="COLOR: rgb(0,0,187)">header</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(221,0,0)">'Content-Type: image/jpeg'</span><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(0,0,187)">ImageJPEG</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$dst</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(221,0,0)">''</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">100</span><span style="COLOR: rgb(0,119,0)">); <br></span><span style="COLOR: rgb(0,0,187)">?></span> <br><br>原图:<br><img src="https://cdn.ancii.com/article/image/v1/g4/-x/FX/XF-4xgQdHYf1wWImd0fqy0cF9jc2eZYjsNlTqStj9hSzN-ZVqTucM4ah6gYey8etpHzplznEwyyWFquZKP6kJw.jpg" title="php下用GD生成生成缩略图的两个选择和区别" alt="php下用GD生成生成缩略图的两个选择和区别" /><br><br>使用</span><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"></span><span style="COLOR: rgb(0,0,187)">ImageCopyResized</span><span style="COLOR: rgb(0,119,0)">()<span style="COLOR: rgb(0,0,0)">函数生成的结果:<br><img src="https://cdn.ancii.com/article/image/v1/g4/-x/FX/XF-4xgQdHYf1wWImd0fqy0cF9jc2eZYjsNlTqStj9hSYwuO4jzd7JTEutybdoQWVpHzplznEwyyWFquZKP6kJw.jpg" title="php下用GD生成生成缩略图的两个选择和区别" alt="php下用GD生成生成缩略图的两个选择和区别" /><br><br><br></span></span></span><span style="COLOR: rgb(0,0,0)">使用</span><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"></span><span style="COLOR: rgb(0,0,187)">ImageCopyResampled</span><span style="COLOR: rgb(0,119,0)">()<span style="COLOR: rgb(0,0,0)">函数生成的结果:</span></span></span><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"><span style="COLOR: rgb(0,0,0)"><br></span><br></span><span style="COLOR: rgb(0,0,187)"></span></span>


很明显可以看到两个函数生成的图像效果是不一样的,<span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,187)">ImageCopyResampled</span><span style="COLOR: rgb(0,119,0)">()<span style="COLOR: rgb(0,0,0)">函数生成的结果比较平滑,效果较好。<br><br></span></span></span><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"><span style="COLOR: rgb(0,0,0)"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,119,0)"><span style="COLOR: rgb(0,0,0)"><pre><font size="2">顺便贴一个效果,用ASCII表示图像。ImageColorAt()有一个很有趣的用处,它可以循环检查<br></font><font size="2">图像中的每一个像素的颜色,然后对该颜色数据进行操作。</font></pre> <pre><font face="宋体" size="2"><span style="FONT-SIZE: 12pt">源代码:<br></span></font><font face="Courier New"><html></font></pre> <pre><font face="Courier New"><body bgcolor="#000000" style="line-height:6pt"> </font><font face="Courier New"><span style="COLOR: rgb(0,0,187)"><?php <br> $im </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">imagecreatefromjpeg</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(221,0,0)">'test1.jpg'</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(0,0,187)">$dx </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">imagesx</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$im</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">); <br> </span><span style="COLOR: rgb(0,0,187)">$dy </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">imagesy</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$im</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">); <br> for(</span><span style="COLOR: rgb(0,0,187)">$y </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,119,0)">; </span><span style="COLOR: rgb(0,0,187)">$y </span><span style="COLOR: rgb(0,119,0)">< </span><span style="COLOR: rgb(0,0,187)">$dy</span><span style="COLOR: rgb(0,119,0)">; </span><span style="COLOR: rgb(0,0,187)">$y</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">++) { <br>     for(</span><span style="COLOR: rgb(0,0,187)">$x</span><span style="COLOR: rgb(0,119,0)">=</span><span style="COLOR: rgb(0,119,0)">; </span><span style="COLOR: rgb(0,0,187)">$x </span><span style="COLOR: rgb(0,119,0)">< </span><span style="COLOR: rgb(0,0,187)">$dx</span><span style="COLOR: rgb(0,119,0)">; </span><span style="COLOR: rgb(0,0,187)">$x</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">++) { <br>         </span><span style="COLOR: rgb(0,0,187)">$col </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">imagecolorat</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$im</span><span style="COLOR: rgb(0,119,0)">, </span><span style="COLOR: rgb(0,0,187)">$x</span><span style="COLOR: rgb(0,119,0)">, </span><span style="COLOR: rgb(0,0,187)">$y</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">); <br>         </span><span style="COLOR: rgb(0,0,187)">$rgb </span><span style="COLOR: rgb(0,119,0)">= </span><span style="COLOR: rgb(0,0,187)">imagecolorsforindex</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$im</span><span style="COLOR: rgb(0,119,0)">,</span><span style="COLOR: rgb(0,0,187)">$col</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">); <br>         </span><span style="COLOR: rgb(0,0,187)">printf</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(221,0,0)">'<font color=#%02x%02x%02x>*</font>'</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">, <br>                 </span><span style="COLOR: rgb(0,0,187)">$rgb</span><span style="COLOR: rgb(0,119,0)">[</span><span style="COLOR: rgb(221,0,0)">'red'</span><span style="COLOR: rgb(0,119,0)">],</span><span style="COLOR: rgb(0,0,187)">$rgb</span><span style="COLOR: rgb(0,119,0)">[</span><span style="COLOR: rgb(221,0,0)">'green'</span><span style="COLOR: rgb(0,119,0)">],</span><span style="COLOR: rgb(0,0,187)">$rgb</span><span style="COLOR: rgb(0,119,0)">[</span><span style="COLOR: rgb(221,0,0)">'blue'</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">]); <br>     } <br>     echo </span><span style="COLOR: rgb(221,0,0)">"<br>\n"</span></font><font face="Courier New"><span style="COLOR: rgb(0,119,0)">; <br> } <br> </span><span style="COLOR: rgb(0,0,187)">imagedestroy</span><span style="COLOR: rgb(0,119,0)">(</span><span style="COLOR: rgb(0,0,187)">$im</span></font><span style="COLOR: rgb(0,119,0)"><font face="Courier New">); <br></font></span><font face="Courier New"><span style="COLOR: rgb(0,0,187)">?> <br></span></body></html> </font></pre> <p><img src="https://cdn.ancii.com/article/image/v1/g4/-x/FX/XF-4xgQdHYf1wWImd0fqy0cF9jc2eZYjsNlTqStj9hTHHtPZW6vBC1SXGG8GWIvJm1RCeymJsyuUntUfQ_n4lQ.gif" title="php下用GD生成生成缩略图的两个选择和区别" alt="php下用GD生成生成缩略图的两个选择和区别" /></p></span></span></span>很有趣吧,呵呵..

相关推荐