Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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中对JPEG图像执行无损旋转?_Php_Image Manipulation_Lossless - Fatal编程技术网

是否可以在PHP中对JPEG图像执行无损旋转?

是否可以在PHP中对JPEG图像执行无损旋转?,php,image-manipulation,lossless,Php,Image Manipulation,Lossless,我需要旋转一些现有的JPG图像。它们已经丢失了一些细节,但我现在想旋转它们,不再丢失更多细节 稍加研究,似乎PHP唯一的无损图像旋转库就是使用该库 在进行无损jpg旋转时,还有其他选择吗? 谢谢 是否可以调用外部程序,比如通过exec(“命令行”) 另一个选项是jpegtranbyJPEG是一种有损格式,因此答案是否定的,您不能在任何应用程序、编程语言或大师冥想上创建JPEG的无损旋转 但是,如果以JPEG格式保存旋转的JPEG,则可以在保存旋转的JPEG时使用$quality参数来最大限度地减

我需要旋转一些现有的JPG图像。它们已经丢失了一些细节,但我现在想旋转它们,不再丢失更多细节

稍加研究,似乎PHP唯一的无损图像旋转库就是使用该库

在进行无损jpg旋转时,还有其他选择吗?


谢谢

是否可以调用外部程序,比如通过exec(“命令行”)


另一个选项是jpegtranby

JPEG是一种有损格式,因此答案是否定的,您不能在任何应用程序、编程语言或大师冥想上创建JPEG的无损旋转

但是,如果以JPEG格式保存旋转的JPEG,则可以在保存旋转的JPEG时使用
$quality
参数来最大限度地减少图像数据丢失。如果您以无损格式保存,那么您已经将图像数据丢失降至最低

例如:

$img = imagecreatefromjpeg($file);
$rot = imagerotate($img, 90, 0);
imagejpeg($rot, $output, 100); /* set quality to 100% */

小心jpegtran当顺时针或逆时针旋转90度时,它不会按预期旋转所有像素,因为它只能在尺寸为jpeg块大小倍数(通常为8x8像素)的区域内进行无损旋转。它在内部旋转每个块内的像素,以避免图像的重新压缩,但边缘块不能像那样旋转。因此,使用JPEG-TRAN-rotate 90或270时,边缘会留下一小段未旋转的像素,需要使用-trim选项来去除它们,但结果图像将比原始图像小几个像素


因此,虽然这是一种无损旋转,但在旋转过程中仍会丢失一些像素。

jpg本质上是有损的。也许可以试试PNG?JPG的压缩有一个特殊的特性,允许无损旋转。图像的每个8x8单元都以一种可以旋转和重新排序的方式单独压缩。@Talvi我认为JPEG无损旋转背后的想法是不再引入任何损失。如果你只是打开一个JPEG,旋转它并再次保存(进一步压缩图像),那么结果图像将比你开始使用的图像更具损耗性;PHP的速度非常慢(这包括它的图像处理库),你最好调用一个实际编译过的程序。我要试试这个。只要它能在Linux上工作。+1建议将目光放在PHP领域之外——超越其久经考验的优势,PHP就不是一个100%覆盖率的web工具。看起来新的jpegtran替代品是
exiftran
,它也是EXIF感知的。()抱歉,JPG已保存,因此已丢失一些详细信息。我现在想旋转有损图像,但不丢失任何进一步的细节。根据我的建议,您将实现这一点。如果不需要输出为JPEG,可以使用其他无损格式,如png:imagepng($rot,$output);看起来新的jpegtran替代品是
exiftran
,它也支持EXIF()。我不知道它是否有同样的弱点?是的,它似乎也有同样的弱点。这使得它也无法使用。既然我的FastStone图像查看器可以做到,为什么他们不能正确地进行裁剪呢?关于为什么某些图像需要裁剪的额外细节:tl;dr not CROPING将移动并重新量化整个图像,或者使用可能未初始化的数据扩展图像。