如何使用PHP调整高分辨率图片的大小
当用户上传图片时,我正在处理图像,但我的问题是高分辨率图片。您如何检测用户何时上载?我正在使用PHP的GD库。使用imagejpeg()方法将质量设置为90不会对其产生任何影响,而是缩放尺寸,然后将ppi设置为72。我希望能够保留尺寸,同时将ppi降到72。任何建议都将不胜感激。如果您正在减少ppi,尺寸将改变以反映减少的情况-每英寸像素数减少意味着您的图片将减少英寸。就您而言,没有ppi这样的事情。此外,数字媒体中不存在DPI。只有像素和尺寸(这只是两个方向上像素的测量值) 你真正想做的是减少图像的采样,减少图像的整体尺寸。您可能希望按比例执行此操作,也就是说,您希望保持相同的宽高比,以便图像在重新采样后不会出现拉伸。同样值得注意的是,调整大小和重新采样的不同之处在于,调整大小时不会太注意内容,从而导致调整后的图像视觉效果非常差。您可能需要重新采样 PHP文档中有一些关于GDImage库以及使用GDImage库的好例子。我建议你去看看。您可能想了解的其他相关方法:如何使用PHP调整高分辨率图片的大小,php,image,gd,high-resolution,Php,Image,Gd,High Resolution,当用户上传图片时,我正在处理图像,但我的问题是高分辨率图片。您如何检测用户何时上载?我正在使用PHP的GD库。使用imagejpeg()方法将质量设置为90不会对其产生任何影响,而是缩放尺寸,然后将ppi设置为72。我希望能够保留尺寸,同时将ppi降到72。任何建议都将不胜感激。如果您正在减少ppi,尺寸将改变以反映减少的情况-每英寸像素数减少意味着您的图片将减少英寸。就您而言,没有ppi这样的事情。此外,数字媒体中不存在DPI。只有像素和尺寸(这只是两个方向上像素的测量值) 你真正想做的是减少
- 将允许您在不打开图像的情况下检查图像的尺寸(用于检查是否需要在不加载图像的情况下调整图像大小)
- 并获取GD图像资源的维度
img.jpg
和img-500dpi.jpg
在浏览器中的大小将完全相同。即使你直接打开图像。即使使用物理单位,如cm
:
img { width: 8cm; height: 6cm; }
两幅图像将以相同的大小显示;无论使用何种图像分辨率,物理单位都会转换为像素。令人惊讶的是,即使您尝试在Firefox中打印原始图像(而不是页面),它们都将以相同的大小打印。无法在其他浏览器上发表评论。够奇怪的了-这在Irfanview中可以正常工作
PPI与视网膜图像
现在,随着iPhone等设备的出现,视网膜(即高分辨率)图像变得越来越流行。在这里,人们谈论了很多关于DPI(事实上是PPI)的内容,但这些都只与目标设备和应用程序有关。
没有任何东西能够真正识别你的图像的PPI;您必须以像素为单位指定高分辨率视网膜图像的实际尺寸。这是66x66图标()的示例:
因此,您实际上可以通过在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);
请注意,这需要相当多的内存,这可能会受到主机提供商的限制。bool Imagick::setResolution(float$x\u分辨率,float$y\u分辨率)非常感谢您的深入了解。我将检查这些方法。我忘了提到我正在使用jCrop,它基本上是将它传递给一个处理各种大小输出的函数。但是高分辨率图片让我感到困惑。你可能会对他们关于缩放大图像的文档页面感兴趣:非常有趣。我会记住这一点。谢谢你的发现+1用于解释调整大小和重新采样之间的区别。我的意思是说分辨率,因为我试图检测用户何时上传分辨率设置为300的图片,但当您设置为72时,图像实际上很小。这是真的吗?因为我已经读到ppi和dpi是用于打印的,在屏幕上是无用的PCs@Alex当显示图像时,ppi/dpi表示在屏幕上以“100%”大小查看时图像的质量。很好,我已经读到imagick非常健壮,因此如果其他方法都失败,我可能会使用此方法。非常感谢你!
img { width: 8cm; height: 6cm; }
@media (-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
.box {
background:url('images/icon66x66.png') no-repeat top left;
background-size: 33px 33px;
}
}
$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);