PHP中如何保留原始图像并绘制其水平翻转后的图像?
解决PHP GD图像翻转后保留原始图像的问题
首先,咱们先理清你的核心需求:要在保留原始图像的基础上,添加一个水平(或后续垂直)翻转后的版本,但imageflip()是直接修改传入的图像资源的,所以直接用它会覆盖原图。另外也帮你搞定透明填充不生效的小问题。
步骤1:先修复透明背景不生效的问题
你之前写的$transparent = imagecolorallocatealpha($image, 255, 255, 255, 0);里,alpha值设为0代表完全不透明,所以填充后看不到透明效果。GD库中alpha的取值范围是0-127,127才是完全透明,把这个值改过来就好了。
步骤2:复制图像资源实现翻转叠加
要保留原图,核心思路是先创建原图的副本,对副本进行翻转操作,再把翻转后的内容绘制回原图上。这样原图的内容不会被修改,还能叠加翻转后的效果。下面是修改后的完整代码:
<?php $image = imagecreatetruecolor(400, 300); imagesavealpha($image, true); // 设置完全透明背景(alpha=127) $transparent = imagecolorallocatealpha($image, 255, 255, 255, 127); imagefill($image, 0, 0, $transparent); imagesetthickness($image, 2); $red = imagecolorallocate($image, 255, 0, 0); $blue = imagecolorallocate($image, 0, 0, 255); // 绘制原始图形 imagerectangle($image, 2, 2, 398, 298, $red); imagedashedline($image, 0, 150, 400, 150, $blue); imagedashedline($image, 200, 0, 200, 300, $blue); imagepolygon($image, array( 10, 180, 10, 250, 110, 250 ), 3, $red); // 1. 创建原图的副本用于翻转 $flippedImage = imagecreatetruecolor(400, 300); imagesavealpha($flippedImage, true); imagefill($flippedImage, 0, 0, $transparent); // 把原图内容复制到副本上 imagecopy($flippedImage, $image, 0, 0, 0, 0, 400, 300); // 2. 对副本执行水平翻转 imageflip($flippedImage, IMG_FLIP_HORIZONTAL); // 3. 把翻转后的副本绘制回原图(矩形和虚线是对称的,叠加后不会有重复感) imagecopy($image, $flippedImage, 0, 0, 0, 0, 400, 300); // 如果后续要做垂直翻转,重复上面的步骤即可 // $verticalFlipped = imagecreatetruecolor(400, 300); // imagesavealpha($verticalFlipped, true); // imagefill($verticalFlipped, 0, 0, $transparent); // imagecopy($verticalFlipped, $image, 0, 0, 0, 0, 400, 300); // imageflip($verticalFlipped, IMG_FLIP_VERTICAL); // imagecopy($image, $verticalFlipped, 0, 0, 0, 0, 400, 300); // 输出图像 ob_start(); imagepng($image); printf('<img src="data:image/png;base64,%s"/>', base64_encode(ob_get_clean())); // 销毁所有图像资源,释放内存 imagedestroy($flippedImage); // imagedestroy($verticalFlipped); // 如果用了垂直翻转的话 imagedestroy($image); ?>
关键细节说明
- 图像副本的作用:通过
imagecreatetruecolor()创建和原图尺寸一致的新画布,启用透明并填充背景后,用imagecopy()把原图内容复制过去,这样翻转副本时完全不会影响到原始图像。 - 翻转叠加的逻辑:因为你的矩形和十字虚线是中心对称的,翻转后和原图叠加不会有视觉上的重复,只有三角形会被复制到对称的右下角位置,正好满足你的需求。
- 透明背景修复:把alpha值改为127后,画布背景就会变成完全透明,后续绘制的图形也能正常显示透明效果。
内容的提问来源于stack exchange,提问作者iKnowNothing
相关产品推荐
相关产品推荐

