You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:57:45