如何使用PHP调整高分辨率图片的大小

时间:2011-01-21 01:35:56

标签: php image gd high-resolution

当用户上传图片时,我正在处理图片,但我的问题是很高的rez pics。如何检测用户上传的时间?我正在使用GD库的PHP。使用imagejpeg()方法将质量设置为90不会对其执行任何操作,但会缩放尺寸,然后将ppi设置为72.我希望能够保留尺寸并同时将ppi降至72。任何建议都将不胜感激。

6 个答案:

答案 0 :(得分:14)

就你需要关注的而言,没有PPI这样的东西。此外,DPI不存在于数字中。只有像素和尺寸(这只是两个方向上像素的测量值)。

您真正想要做的是对图像进行缩减采样,从而减少图像的整体尺寸。你可能会想这样做的比例,这是说你要宽度相同比率保持高度,使图像不出现重采样之后拉伸。另外值得注意的是,调整大小和重新采样的不同之处在于,调整大小并不会过多地关注内容,从而导致视觉上很差的调整大小的图像。你可能想要重新取样。

PHP文档在handling uploaded files以及使用GDImage库的how to resize images上有一些很好的例子。我建议你看看。您可能想了解的其他相关方法:

  • getimagesize()将让你检查的图像的尺寸,而无需打开它(有用判断是否需要,而无需装载它被调整)。
  • imagesx()imagesy()抓取GD图像资源的尺寸。

答案 1 :(得分:12)

PPI,DPI ......

首先,让我们澄清术语。 PPI (每英寸像素数)和 DPI (每英寸点数)都是指定像素转换为物理单位的比率(在这种情况下为英寸)。在数字世界中 - 计算机,图像,... 在使用PPI时错误地使用DPI 。 DPI实际上只存在于印刷世界中。但对我们来说, DPI = PPI >> More info

分辨率信息(有时称为DPI,但它是PPI)存储在标题中(图像元信息)。 JPG和PNG支持这一点;但是GIF doesn't support DPI - 它不在GIF header中。

在PHP中更改PPI

那么,您可能会问如何在图像标题中设置PPI(DPI)?在PHP中,您可以使用Imagick库(当然不适用于GIF)来实现:

$image = new Imagick('img.jpg'); // default 72 dpi image
$image->setImageResolution(500, 500);
$image->writeImage("img-500dpi.jpg"); // this image will have 500 dpi

如果您下载这些图片并尝试打印它们,例如在IrfanView中,它实际上会使用dpi信息将像素转换为目标物理单位。两张图片都将以不同尺寸打印。

图片PPI无法在网络上运行

坏消息是,在网页上显示图片时,这不会改变任何。显示的anchor unit始终是CSS中的一个像素。因此img.jpgimg-500dpi.jpg在浏览器中的大小完全相同。即使您直接打开图像。即使你使用像cm这样的物理单位:

img { width: 8cm; height: 6cm; }

两个图像将以相同的尺寸显示;无论使用fixed ratio的图像分辨率如何,物理单位都会转换为像素。令人惊讶的是,即使您尝试在Firefox中打印原始图像(而不是页面),它们也将以相同的尺寸打印。无法评论其他浏览器。很奇怪 - 这在Irfanview中的表现如预期的那样。

PPI和视网膜图像

现在有了Iphones等视网膜(即高分辨率)图像变得时髦。这里有很多关于DPI(实际上是PPI)的内容,但这只与目标设备和CSS media queries有关。 没有任何东西可以真正识别你的形象的PPI;您必须以像素为单位指定高分辨率视网膜图像的实际尺寸。这是66x66图标(from here)的示例:

@media (-webkit-min-device-pixel-ratio: 2), 
       (min-resolution: 192dpi) { 
    .box {
        background:url('images/icon66x66.png') no-repeat top left;
        background-size: 33px 33px;
    }
}

因此,您可以通过在CSS 中为它们设置较低的尺寸来实际“缩小”高分辨率图像。但我只建议对视网膜图像和正确的媒体查询进行此操作。

因此,您必须在PHP中重新取样

所以实际上,如果你想让上传的图像在网上显得更小,最好的方法就是重新取样。重新采样意味着不仅仅更改标题,而是更改图像的实际像素矩阵。这是我在PHP中使用的代码,它使用GD库:

$t = imagecreatefromjpeg($old_img_path);
$s = imagecreatetruecolor($new_width, $new_height);
$x = imagesx($t);
$y = imagesy($t);
imagecopyresampled($s, $t, 0, 0, 0, 0, $new_width, $new_height, $x, $y);
imagejpeg($s, $new_img_path);
chmod($new_img_path, 0644);

请注意,这需要相当多的内存,这可能会受到托管服务提供商的限制。

答案 2 :(得分:1)

如果你正在处理高分辨率图像,我会沿着ImageMagick路径走下去,因为它紧固+提供了更多关于图像的信息+让你以300 DPI(或其他分辨率)写回图像如果你愿意的话。

以下是我对Jcrop和ImageMagick所做的事情(但是在72 DPI时)

    $picture = new Imagick($src);
    $picture->cropImage( $_POST['w'],  $_POST['h'],  $_POST['x'],  $_POST['y']);

    $picture->resizeImage(690, 500, Imagick::FILTER_LANCZOS,1, true);
    $picture->writeImage($cropped);
    $picture->clear();
    $picture->destroy();

答案 3 :(得分:1)

使用phpthumb(http://phpthumb.gxdlabs.com)是一个很好,优雅且简单的解决方案。

我有一个使用它的工作代码示例上传到GitHub。它可以同时使用GD& Imagemagick,这取决于你。

https://github.com/lopezator/thumbNailGenerator

答案 4 :(得分:1)

bool Imagick :: setResolution(float $ x_resolution,float $ y_resolution)

答案 5 :(得分:0)

如果您正在降低ppi,尺寸将会改变以反映减少 - 每英寸像素数减少意味着您的照片将减少英寸。