当用户上传图片时,我正在处理图片,但我的问题是高清晰度图片。当用户上传时,你如何检测?我正在使用PHP的GD库。使用imagejpeg()方法将质量设置为90不会对其做任何操作,而是缩放尺寸,然后将ppi设置为72。我希望能够保留尺寸,同时将ppi降至72。任何建议都将不胜感激。
发布于 2011-01-21 09:45:44
就你所需要考虑的而言,没有PPI这样的东西。另外,DPI不存在于数字环境中。只有像素和尺寸(这只是两个方向上像素的测量值)。
你真正想做的是对图像进行下采样,减少图像的整体尺寸。你可能想要按比例来做,也就是说,你想保持相同的宽高比,这样图像在重采样后就不会显示为拉伸。同样值得注意的是,调整大小和重新采样的不同之处在于,调整大小不会太关注内容,导致调整后的图像视觉效果非常差。您可能需要重采样。
PHP文档中有一些关于handling uploaded files和使用GDImage库的how to resize images的很好的例子。我建议你去看看。您可能想知道的其他相关方法:
发布于 2014-01-25 07:56:14
PPI,DPI...
首先,让我们澄清一下术语。PPI (每英寸像素数)和DPI (每英寸点数)都是指定像素到物理单位(本例中为英寸)的转换的比率。在数字世界中-计算机,图像,...在应该使用PPI而不是的地方错误地使用DPI。实际上,DPI只存在于印刷领域。但对我们来说,PPI 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在web上不起作用
坏消息是,当在网页上显示图像时,这不会改变任何事情。在CSS中,显示的anchor unit始终是一个像素。因此,img.jpg和img-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);请注意,这需要相当多的内存,这可能会受到您的主机提供商的限制。
发布于 2011-01-21 12:28:58
如果你经常处理高分辨率图像,我会使用ImageMagick,因为它更快,提供了更多关于图像的信息,如果你愿意,可以让你以300dpi(或其他分辨率)写回图像。
下面是我对Jcrop和ImageMagick所做的(但在72dpi)
$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();https://stackoverflow.com/questions/4754594
复制相似问题