旋转和裁剪图像批次

时间:2016-01-21 16:52:42

标签: php

编辑:请忘记这个问题!我在原始代码中犯了一个愚蠢的错误。 示例代码按预期工作!

我试图旋转和裁剪图像。 到目前为止我有这个:

$w = 100;
$h = 400;
$img1 = imagecreatefromjpeg('image1.jpg');
$img2 = imagecreatefromjpeg('image2.jpg');
for ($i = 0; $i < 2; $i++) {
    ${'img'.$i + 3} = imagecreatetruecolor($h, $h);
    imagecopy(${'img'.$i + 3}, ${'img'.$i + 1}, 0, 0, 0, 0, $w, $h);
    ${'img'.$i + 3} = imagerotate(${'img'.$i + 3}, 90, 0);
    ${'img'.$i + 3} = imagecrop(${'img'.$i + 3}, array(0, 0, $h, $w));
    imagejpeg(${'img'.$i + 3});
    imagedestroy(${'img'.$i + 3});
    imagedestroy(${'img'.$i + 1});
}

所以我基本上做的是打开一些JPG,创建新图像,将JPG复制到新图像中然后裁剪图像。

这会导致空图像......

我做错了什么?

2 个答案:

答案 0 :(得分:0)

不知道这是否会对输出的不足产生任何影响 - 但是$img1&amp; $img2这样做 - 我觉得它们没有被使用?

@error_reporting( E_ALL );
$w = 100;
$h = 400;

$img1 = imagecreatefromjpeg('image1.jpg');
$img2 = imagecreatefromjpeg('image2.jpg');

for ($i = 0; $i < 3; $i++) {

        $new=${'img'.$i + 3};
        $src=${'img'.$i + 1};


    $new = imagecreatetruecolor($h, $h);
    imagecopy( $new, $src, 0, 0, 0, 0, $w, $h);

    $new = imagerotate($new, 90, 0);
    $new = imagecrop($new, array(0, 0, $h, $w));

    imagejpeg($new);

    imagedestroy($new);
    imagedestroy($src);

    break;/* just to see if it gets this far*/
}

答案 1 :(得分:0)

首先,您应该考虑使用image copy resampled来提高流程结果的质量。

然后,您需要正确使用imagejpeg功能,目前您只是加载JPG并直接输出它们,这可能是您想要的但是您已经处于循环中并且您可以&#39 ; t循环将多个图像直接加载到同一个文件中。这也意味着您看到(或不看)的图像是该集合中的最终图像。

你的问题是你的for循环运行了三次,但你的唯一数据与前两个实例相关联,但第三个实例是空的,因为这是最新的,这是唯一的实例输出到浏览器。

所以:

1)使用imagejpeg($data,$filename);保存您生成的图像。您可以将文件名定义为$filename = $img+3.".jpg";或类似名称。

2)如果使用数组而不是数字增量变量,调试和读取代码也会容易得多,这是编写代码的一种非常混乱的方式!

3)如果您确实想要将图像直接输出到浏览器,则需要PHP在输出header('Content-Type: image/jpeg');的内容之前提供诸如imagejpeg 之类的标题。

重新编写代码:

$w = 100;
$h = 400;
$img[1] = imagecreatefromjpeg('image1.jpg');
$img[2] = imagecreatefromjpeg('image2.jpg');
for ($i = 3; $i < 5; $i++) {
    $img[$i] = imagecreatetruecolor($h, $h);
    $j = $i -2;
    imagecopyresampled($img[$i], $img[$j], 0, 0, 0, 0, $h, $h, $w, $h,);
    // this function also contains destination width and destination 
    // height, which are equal to the size of the destination image so 
    // are set as $h, $h in the function above. 
    $img[$i] = imagerotate($img[$i], 90, 0);
    $img[$i] = imagecrop($img[$i], array(0, 0, $h, $w));
    $filename = "image-".$i.".jpg";
    imagejpeg($img[$i], $filename);
    imagedestroy($img[$i]);
    imagedestroy($img[$j]);
}