PHP图像缩放使用最近邻插值?

5

我有一张16x16像素的PNG或GIF图片,想要在网站上以64 x 64像素的大小展示它的像素风格。在Firefox 3.6+和IE浏览器中,我可以使用CSS的image-rendering和-ms-interpolation-mode属性轻松实现此功能。但由于这种方法不适用于所有浏览器,我想使用PHP动态调整图片大小。那么,在PHP中使用最近邻插值算法调整图像大小的最佳方法是什么?

5个回答

8

如果您想在调整大小时保留像素化效果,您需要使用GD库执行以下操作:

<?php
// create GD image resource from source image file
$src = imagecreatefromgif('test.gif');

// create new GD image resource with indexed color
$dest = imagecreate(64, 64);

// copy/resize image without resampling
imagecopyresized($dest, $src, 0, 0, 0, 0, 64, 64, 16, 16);

// output result
header('Content-type: image/gif');
imagegif($dest);
?>

我已经测试了这段代码,但是像素化问题仍然存在。你需要修改代码,使其也能够接受PNG文件作为输入,这应该很容易实现,因为GD gif函数的每个对应都有相应的PNG函数。希望这可以帮到你。


1

如果你需要调整GIF大小,你可以使用ImageMagick项目。

你可以使用GD库,但是可能会丢失一些EXIF数据。

KusabaX项目有一个很棒的图像转换功能。请查看文件“/inc/func/posts.php”的第58行。;-)


谢谢 - 我知道用GD是可能的,但我想知道最好的方法是什么。对于我的目的来说,失去EXIF数据并不重要。 - shipshape

1

http://www.imagemagick.org/Usage/misc/#interpolate

http://www.francodacosta.com/blog/phmagick/examples/resizing-images

这是关于imagemagick中插值的一些信息。第二个链接是一个名为phMagick的类,它是对imagemagick库的完整封装。所提供的示例仅用于基本的调整大小操作,但没有设置插值标志以进行命令行调用。

通过该类,您可以完全访问命令行,如果缺乏插值标志支持,则可以通过插件轻松扩展该类的机制。它也已准备好php5。

如果这不能指引您朝正确的方向前进,那我不知道还有什么能。如果没有其他办法,phMagick类应该为编写适用于特定目的的更简洁的封装程序提供良好的起点。


我原本以为我没有访问Imagemagick的权限,但是我刚刚向我的托管服务提供商查询了一下,结果发现我是有权限的。所以这很有帮助,谢谢! - shipshape

0

Symphony 是一个强大的 PHP 框架,它利用 JIT 操作器,使所有这些都变得轻而易举! :P

在你的情况下,一个图片会是

<img src="http://yoursite.com/image/1/64/64/0/images/16pixels.jpg"/>

0

答案是,这并不重要。缓存结果。保存结果的硬拷贝并输出。如果图像没有识别信息发生变化,则仅执行一次。

你可能会认为这不是正确的答案。它不是你所要求的。但这是最好的答案。随着时间的推移,它将节省最多的处理时间。到了一定程度,图片重新调整大小的初始加载时间完全无关紧要,它可能需要30秒才能呈现,并且只会影响一个人,一次。


这很重要-他有一个稍微不太正常的用例,并想知道从php文件处理最近邻居/整数插值的便捷方法。告诉他在他解决了他问的问题后该怎么做有点粗鲁 - 特别是当你甚至没有试图回答实际问题时。 - Abba Bryant
谢谢 - 我知道可以使用GD实现,但我想知道最好的方式是什么。发布者已经知道一种实现方法。他们正在寻找“最佳方法”,我提供了这些信息。最好的方法是不要浪费时间寻找更好的方法,而是缓存他/她已经知道的方法的结果。 - DampeS8N
我的问题是关于如何使用PHP的GD函数来调整图像大小,同时保留图像的像素艺术质量。所以不,这并不特别有帮助。 - shipshape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接