图像操作-在PHP中旋转图片一次';s已保存


image manipulation - Rotating a picture in PHP once it's saved

我有一个PHP脚本,可以在我的网站上保存一张图片。保存图片后,如果图片不是横向的,我想将其旋转90度。这是我的一段脚本:

$uploadfile = 'path/where/to/save/picture.jpg';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 
    //The code under here is not working
    if($_GET['landscape'] == false || $_GET['landscape'] == 'false'){
        $img = imagecreatefromjpeg($uploadfile);
        $newimg = imagerotate($img, 90.0, 0);
        imagejpeg($newimg, $uploadfile);
    }
    //this is code under here is working
    $prev = create_preview($filename, $uploadfile, $ext, true);
}

正如你所看到的,我移动_uploaded_file((,然后我有一个if语句,如果图片不是横向的(所以横向==false(,我会旋转它。然后我创建图片的预览。

如果我注释掉了检查横向的If语句,代码就起作用了,所以它上传了图片,但没有按照我的意愿旋转,并创建了一个预览。如果我让If取消注释(就像在本例中一样(,它似乎不再被保存,因为当我试图可视化它时,我什么也看不到。这意味着代码流进入if,然后发生一些事情,图片不再可视化。问题出在旋转图片的if语句中。

因此,旋转图片的过程中肯定有问题,但我不明白到底出了什么问题,我从上传到的位置创建了图像,我使用PHP函数旋转它,然后在相同的确切位置重新创建图像。

你们中有人能看出我哪里搞错了吗?

谢谢,

Masiar

很遗憾您看不到错误消息。我建议写一个小的测试页面,它会"伪造"iPhone的一面,并允许你在不使用手机的情况下通过提交图像进行测试。或者简单地编写一个简短的脚本,打开一个图像,imagerotate()并保存它,然后将其用于测试。

此外,正如gnud所指出的,PHP错误甚至可能已经被写入服务器日志文件。(通常,它们会在类似/var/log/apache/...的地方,但我想,超级用户更难弄清楚它们在盒子上的位置…(

话虽如此,鉴于您所说的,我怀疑您正在使用的Linux发行版的PHP包不支持GD库的(经过大量编辑的(PHP"打包"版本。有关详细信息,请参阅此Ubuntu增强请求。

这意味着您正在使用的imagerotate()函数根本不存在。如果您启用了错误报告并使用了测试脚本,您可以很容易地验证这一点。

作为一种变通方法,您可以选择找到一个可以安装在盒子上的GD库版本来取代标准版本,或者使用用PHP编写的函数手动进行旋转。

或者,正如Eamorr所建议的,你可以使用像ImageMagick这样的命令行工具(或者可以通过PECL ImageMagick库使用ImageMagick,但这可能对一次旋转来说太过了。(

顺便说一句,我相信iPhone通过在图像元数据中设置标志来"旋转"它拍摄的照片(例如横向(,而不是实际旋转图像数据,所以如果你正在旋转iPhone上拍摄的图像,请确保使用纵向和横向拍摄的图像进行测试,并检查您的图像旋转在每种情况下都做了正确的事情。

如果我没有记错的话,照片数据总是纵向,如果照片是在手机横向拍摄的,则在EXIF方向数据中只设置了"景观"。如果手机被倒置,也有不同的值。

要翻转180度:

exec('gridy-flip/path/to/your/picture'(;

您需要安装imagemagick

我相信你能很容易地把它翻转90度。