Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP调整高分辨率图片的大小_Php_Image_Gd_High Resolution - Fatal编程技术网

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

如何使用PHP调整高分辨率图片的大小,php,image,gd,high-resolution,Php,Image,Gd,High Resolution,当用户上传图片时,我正在处理图像,但我的问题是高分辨率图片。您如何检测用户何时上载?我正在使用PHP的GD库。使用imagejpeg()方法将质量设置为90不会对其产生任何影响,而是缩放尺寸,然后将ppi设置为72。我希望能够保留尺寸,同时将ppi降到72。任何建议都将不胜感激。如果您正在减少ppi,尺寸将改变以反映减少的情况-每英寸像素数减少意味着您的图片将减少英寸。就您而言,没有ppi这样的事情。此外,数字媒体中不存在DPI。只有像素和尺寸(这只是两个方向上像素的测量值) 你真正想做的是减少

当用户上传图片时,我正在处理图像,但我的问题是高分辨率图片。您如何检测用户何时上载?我正在使用PHP的GD库。使用imagejpeg()方法将质量设置为90不会对其产生任何影响,而是缩放尺寸,然后将ppi设置为72。我希望能够保留尺寸,同时将ppi降到72。任何建议都将不胜感激。

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

就您而言,没有ppi这样的事情。此外,数字媒体中不存在DPI。只有像素和尺寸(这只是两个方向上像素的测量值)

你真正想做的是减少图像的采样,减少图像的整体尺寸。您可能希望按比例执行此操作,也就是说,您希望保持相同的宽高比,以便图像在重新采样后不会出现拉伸。同样值得注意的是,调整大小和重新采样的不同之处在于,调整大小时不会太注意内容,从而导致调整后的图像视觉效果非常差。您可能需要重新采样

PHP文档中有一些关于GDImage库以及使用GDImage库的好例子。我建议你去看看。您可能想了解的其他相关方法:

  • 将允许您在不打开图像的情况下检查图像的尺寸(用于检查是否需要在不加载图像的情况下调整图像大小)
  • 并获取GD图像资源的维度

如果你经常处理高分辨率图像,我会选择ImageMagick路径,因为fastert+提供了更多关于图像的信息+如果你愿意,可以将图像以300 DPI(或其他分辨率)写回

以下是我对Jcrop和ImageMagick所做的操作(但速度为72 DPI)

使用phpthumb()是一个好的、优雅的、简单的解决方案

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

PPI、DPI。。。 首先,让我们澄清术语。PPI(每英寸像素数)和DPI(每英寸点数数)都是指定像素到物理单位(本例中为英寸数)转换的比率。在数字世界——计算机、图像在应该使用PPI的地方错误地使用了DPI。事实上,新闻部只存在于印刷世界。但现在对我们来说,DPI=PPI

分辨率信息(有时称为DPI,但它是PPI)存储在标题(图像元信息)中。JPG和PNG确实支持这一点;但是,它不存在于

在PHP中更改PPI 因此,您可能会问如何在图像标题中设置PPI(DPI)?在PHP中,可以使用Imagick库(当然不适用于GIF):

如果您下载这些图像并尝试打印它们(例如在IrfanView中),它将实际使用dpi信息将像素转换为目标物理单位。两个图像将以不同的大小打印

图像PPI在web上不起作用 坏消息是,在网页上显示图像时,这不会改变任何东西。在CSS中,显示的颜色始终是一个像素。因此
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);