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

当用户上传图片时,我正在处理图片,但我的问题是高rez pics。如何检测用户上传的时间?我正在使用GD库的PHP。使用imagejpeg()方法将质量设置为90不会对其执行任何操作,但会缩放尺寸,然后将ppi设置为72.我希望能够保留尺寸并同时将ppi降至72。任何建议将不胜感激。     
已邀请:
就你需要关注的而言,没有PPI这样的东西。此外,DPI不存在于数字中。只有像素和尺寸(它们只是两个方向上像素的测量值)。 你真正想做的是对图像进行下采样,减少图像的整体尺寸。您可能希望按比例执行此操作,也就是说您希望保持相同的宽高比,以便在重新采样后图像不会显示为拉伸。另外值得注意的是,调整大小和重新采样的不同之处在于,调整大小并不会过多地关注内容,从而导致视觉上很差的调整大小的图像。您可能想要重新取样。 PHP文档有一些处理上传文件的好例子,以及如何使用GDImage库调整图像大小。我建议你看看。您可能想了解的其他相关方法: getimagesize()可让您在不打开图像的情况下检查图像的尺寸(有助于检查是否需要在不加载图像的情况下调整图像尺寸)。 imagesx()和imagesy()抓取GD图像资源的尺寸。     
PPI,DPI ...... 首先,让我们澄清术语。 PPI(每英寸像素数)和DPI(每英寸点数)都是指定像素转换为物理单位(在这种情况下为英寸)的比率。在数字世界中 - 计算机,图像,...在使用PPI的地方错误地使用DPI。 DPI实际上只存在于印刷世界中。但对我们来说,DPI = PPI。 >>更多信息 分辨率信息(有时称为DPI,但它是PPI)存储在标题中(图像元信息)。 JPG和PNG支持这一点;但GIF不支持DPI - 它不存在于GIF标题中。 在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无法在网络上使用 坏消息是,在网页上显示图像时,这不会改变任何内容。显示器的锚单元始终是CSS中的像素。所以
img.jpg
img-500dpi.jpg
在浏览器中的大小完全相同。即使您直接打开图像。即使你使用像
cm
这样的物理单位:
img { width: 8cm; height: 6cm; }
两个图像将以相同的大小显示;无论使用固定比率的图像分辨率如何,物理单位都被转换为像素。令人惊讶的是,即使您尝试在Firefox中打印原始图像(而不是页面),它们也将以相同的尺寸打印。无法评论其他浏览器。奇怪的是 - 这在Irfanview中如预期的那样有效。 PPI和视网膜图像 现在有了Iphones等视网膜(即高分辨率)图像变得时髦。这里有很多关于DPI(实际上是PPI)的内容,但这只与目标设备和CSS媒体查询有关。 没有任何东西可以真正识别你的形象的PPI;您必须以像素为单位指定高分辨率视网膜图像的实际尺寸。这是66x66图标的示例(从此处):
@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);
请注意,这需要相当多的内存,这可能会受到您的托管服务提供商的限制。     
如果您正在处理高分辨率图像,我会沿着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();
    
使用phpthumb(http://phpthumb.gxdlabs.com)是一个很好,优雅和简单的解决方案。 我有一个工作代码示例使用它上传到GitHub。它可以同时使用GD& Imagemagick,这取决于你。 https://github.com/lopezator/thumbNailGenerator     
bool Imagick :: setResolution(float $ x_resolution,float $ y_resolution)     
如果你正在降低ppi,尺寸将会改变以反映减少 - 每英寸像素数减少意味着你的照片将减少英寸。     

要回复问题请先登录注册