当用户上传图片时,我正在处理图片,但我的问题是很高的rez pics。如何检测用户上传的时间?我正在使用GD库的PHP。使用imagejpeg()方法将质量设置为90不会对其执行任何操作,但会缩放尺寸,然后将ppi设置为72.我希望能够保留尺寸并同时将ppi降至72。任何建议都将不胜感激。
答案 0 :(得分:14)
就你需要关注的而言,没有PPI这样的东西。此外,DPI不存在于数字中。只有像素和尺寸(这只是两个方向上像素的测量值)。
您真正想要做的是对图像进行缩减采样,从而减少图像的整体尺寸。你可能会想这样做的比例,这是说你要宽度相同比率保持高度,使图像不出现重采样之后拉伸。另外值得注意的是,调整大小和重新采样的不同之处在于,调整大小并不会过多地关注内容,从而导致视觉上很差的调整大小的图像。你可能想要重新取样。
PHP文档在handling uploaded files以及使用GDImage库的how to resize images上有一些很好的例子。我建议你看看。您可能想了解的其他相关方法:
答案 1 :(得分:12)
首先,让我们澄清术语。 PPI (每英寸像素数)和 DPI (每英寸点数)都是指定像素转换为物理单位的比率(在这种情况下为英寸)。在数字世界中 - 计算机,图像,... 在使用PPI时错误地使用DPI 。 DPI实际上只存在于印刷世界中。但对我们来说, DPI = PPI 。 >> More info
分辨率信息(有时称为DPI,但它是PPI)存储在标题中(图像元信息)。 JPG和PNG支持这一点;但是GIF doesn't support DPI - 它不在GIF header中。
那么,您可能会问如何在图像标题中设置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信息将像素转换为目标物理单位。两张图片都将以不同尺寸打印。
坏消息是,在网页上显示图片时,这不会改变任何。显示的anchor unit始终是CSS中的一个像素。因此img.jpg
和img-500dpi.jpg
在浏览器中的大小完全相同。即使您直接打开图像。即使你使用像cm
这样的物理单位:
img { width: 8cm; height: 6cm; }
两个图像将以相同的尺寸显示;无论使用fixed ratio的图像分辨率如何,物理单位都会转换为像素。令人惊讶的是,即使您尝试在Firefox中打印原始图像(而不是页面),它们也将以相同的尺寸打印。无法评论其他浏览器。很奇怪 - 这在Irfanview中的表现如预期的那样。
现在有了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中使用的代码,它使用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,这取决于你。
答案 4 :(得分:1)
bool Imagick :: setResolution(float $ x_resolution,float $ y_resolution)
答案 5 :(得分:0)
如果您正在降低ppi,尺寸将会改变以反映减少 - 每英寸像素数减少意味着您的照片将减少英寸。