php创建图像像素化

Posted

技术标签:

【中文标题】php创建图像像素化【英文标题】:php created image pixelated 【发布时间】:2015-08-24 09:54:51 【问题描述】:

我制作了一个应用程序,用户可以在其中上传图像,使用 jCrop 对其进行裁剪,然后通过电子邮件将其发送给他。 一切都按预期工作,但创建图像的 php 脚本在裁剪/调整大小时似乎会降低质量。这不是极端,但我需要与已上传的图像相同的分辨率。我有imagejpg()并用imagepng()更改它,但没有成功。 也许你可以帮助我。 代码如下:

list($oWidth, $oHeight) = getimagesize($_POST["hiddenSrc"]);
$xPos = $_POST["x1h"];
$yPos = $_POST["y1h"];
$targ_w = $_POST["wh"];
$targ_h = $_POST["hh"];
$jpeg_quality = 9;

$src = $_POST["hiddenSrc"];


if(mime_content_type($src) == "image/jpeg")

    $img_r = imagecreatefromjpeg($src);

else if(mime_content_type($src) == "image/png")

    $img_r = imagecreatefrompng($src);


$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );

    imagecopyresampled($dst_r,$img_r,0,0,$xPos,$yPos,$targ_w,$targ_h,$targ_w,$targ_h);

if(!file_exists('../FOLDER/'.$_SESSION['foldername'].'/PRODUKT'.$_SESSION['productNameCount'].'.png'))

            imagepng($dst_r,"../FOLDER/".$_SESSION['foldername']."/PRODUKT".$_SESSION['productNameCount'].".png",$jpeg_quality);

脚本的其余部分只是创建文件夹和其他与图像无关的东西

非常感谢!

剩下的只是一些确定图像不会太小的函数,等等。

这是之前/之后的比较:

我知道差异很小,但在打印图像时非常明显

【问题讨论】:

顺便说一句,请记住,在区分大小写的文件系统(在 Unix 服务器上很常见)上,您正在检查的文件是否存在与您正在编写的文件不同,因为您我在一个地方写了“produkt”,在另一个地方写了“PRODUKT”。您可能应该将路径创建一次作为变量并在两个地方都使用它。 jep,你是对的,谢谢。我修好了;) 【参考方案1】:

我认为在您的情况下,它与您用于压缩的值有关。

对于 imagejpeg:质量是可选的,范围从 0(最差质量,较小的文件)到 100(最好的质量,最大的文件)。默认为默认的 IJG 质量值(约 75)。

对于 imagepng:压缩级别从 0(不压缩)到 9。

这是一个示例,说明您的情况可能会出现什么结果:

list($oWidth, $oHeight) = getimagesize($_POST["hiddenSrc"]);
$xPos = $_POST["x1h"];
$yPos = $_POST["y1h"];
$targ_w = $_POST["wh"];
$targ_h = $_POST["hh"];

$src = $_POST["hiddenSrc"];


if(mime_content_type($src) == "image/jpeg")

    $img_r = imagecreatefromjpeg($src);
    $jpeg_quality = 90;

else if(mime_content_type($src) == "image/png")

    $img_r = imagecreatefrompng($src);
    $png_quality = 0;


$dst_r = ImageCreateTrueColor( $targ_w, $targ_h );

    imagecopyresampled($dst_r,$img_r,0,0,$xPos,$yPos,$targ_w,$targ_h,$targ_w,$targ_h);

if(!file_exists('../FOLDER/'.$_SESSION['foldername'].'/produkt'.$_SESSION['productNameCount'].'.png'))

            imagepng($dst_r,"../FOLDER/".$_SESSION['foldername']."/PRODUKT".$_SESSION['productNameCount'].".png",$png_quality);

【讨论】:

请记住,对于 PNG 文件,只有实际文件的大小会受到压缩值的影响;图像质量将保持不变。 (对于PNG文件,压缩值基本上是输入zlib库的压缩因子,用于数据压缩最终结果;它不会改变底层的图像数据。) 谢谢,我之前也有同样的情况,只有 jpeg 并将质量设置为 100,但它似乎无法使原始图像的质量。 我尝试了您的解决方案,但没有任何改变 :( 我不知道调整大小的图像看起来太锐利了,所以强烈的颜色曝光过度并且没有完全锐利。我会在之前添加一个/比较之后。 @user2839873 如果颜色明显不同,也可能是原始图像中嵌入的颜色配置文件以及整体质量有问题。我相信你的例子会很有用,但遗憾的是我要等到我在家才能看到它们;我们的工作防火墙阻止了来自 imgur 的一切 :( 它们不仅没有应有的清脆。【参考方案2】:

替换

$jpeg_quality = 9;

$jpeg_quality = 100;

您可以使用 0 到 100 之间的任何值

【讨论】:

嘿,我已经试过了,但它似乎并没有解决我的问题【参考方案3】:

我终于找到了问题所在。

我将上传的图片转移到了降低质量的数据网址。如果我直接上传图像文件,质量保持不变。 (+ 我正在使用 Imagemagick)

但是现在我在调整图像大小时遇到​​了质量损失问题,但这是另一个故事和另一个话题;)

谢谢大家

【讨论】:

以上是关于php创建图像像素化的主要内容,如果未能解决你的问题,请参考以下文章

创建缩略图,固定大小 - PHP

PHP裁剪图像以固定宽度和高度而不丢失尺寸比

php创建图像像素化

PHP - 快速循环图像像素

PHP GD从创建的PNG修剪透明像素

maplab 2.0 多模态模块化建图框架