我试图旋转和裁剪图像。 到目前为止我有这个:
$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复制到新图像中然后裁剪图像。
这会导致空图像......
我做错了什么?
答案 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]);
}