PHP GD 擴展提供了強大的圖像處理能力。本文詳細講解如何使用 imagecopy() 函數實現圖片沿 X 軸(上下翻轉)與 Y 軸(左右鏡像)的翻轉效果,並提供完整可執行代碼。
imagecopy() 可將源圖像的一部分複製到目標畫布。翻轉的本質是:按像素列/行逆序複製。
<?php
header("Content-Type: text/html; charset=utf-8");
/**
* 圖片沿 Y 軸翻轉(左右鏡像)
* @param string $filename 源圖路徑(PNG)
* @param string $output 輸出路徑
*/
function flipY($filename, $output = 'flip_y.png') {
$src = imagecreatefrompng($filename);
$w = imagesx($src);
$h = imagesy($src);
$dst = imagecreatetruecolor($w, $h);
for ($x = 0; $x < $w; $x++) {
// 源圖第 x 列 -> 目標圖第 (w - x - 1) 列
imagecopy($dst, $src, $w - $x - 1, 0, $x, 0, 1, $h);
}
imagepng($dst, $output);
imagedestroy($src);
imagedestroy($dst);
}
/**
* 圖片沿 X 軸翻轉(上下翻轉)
* @param string $filename 源圖路徑(PNG)
* @param string $output 輸出路徑
*/
function flipX($filename, $output = 'flip_x.png') {
$src = imagecreatefrompng($filename);
$w = imagesx($src);
$h = imagesy($src);
$dst = imagecreatetruecolor($w, $h);
for ($y = 0; $y < $h; $y++) {
// 源圖第 y 行 -> 目標圖第 (h - y - 1) 行
imagecopy($dst, $src, 0, $h - $y - 1, 0, $y, $w, 1);
}
imagepng($dst, $output);
imagedestroy($src);
imagedestroy($dst);
}
// 測試
flipY('1.png', 'flip_y.png');
flipX('1.png', 'flip_x.png');
?>
<div style="display:flex; gap:20px; flex-wrap:wrap;">
<div><h4>原圖</h4><img src="1.png" style="border:1px solid #ccc;"></div>
<div><h4>Y 軸翻轉(左右鏡像)</h4><img src="flip_y.png" style="border:1px solid #ccc;"></div>
<div><h4>X 軸翻轉(上下翻轉)</h4><img src="flip_x.png" style="border:1px solid #ccc;"></div>
</div>
| 參數 | 說明 |
|---|---|
imagecopy($dst, $src, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h) | 將源圖 ($src) 從 ($src_x, $src_y) 起、寬 $src_w、高 $src_h 的矩形區域,複製到目標圖 ($dst) 的 ($dst_x, $dst_y)。 |
| Y 軸循環 | $dst_x = $w - $x - 1 實現水平鏡像;寬度固定為 1 像素,高度為圖片高度 $h。 |
| X 軸循環 | $dst_y = $h - $y - 1 實現垂直鏡像;高度固定為 1 像素,寬度為圖片寬度 $w。 |
| 資源釋放 | 務必呼叫 imagedestroy() 釋放記憶體,避免洩漏。 |
將 imagecreatefrompng 替換為對應函數(imagecreatefromjpeg、imagecreatefromgif、imagecreatefromwebp),輸出時用 imagejpeg、imagegif、imagewebp 即可。建議封裝為統一介面,自動偵測 MIME 類型。
逐像素複製效率較低。大圖或高頻場景建議:
imageflip()(PHP 5.5+ 內建,支援 IMG_FLIP_HORIZONTAL / IMG_FLIP_VERTICAL / IMG_FLIP_BOTH)。$im->flipImage() / $im->flopImage()。掌握 imagecopy() 的座標映射邏輯,不僅能實現翻轉,還能延伸至裁剪、縮放、水印、拼圖等所有像素級操作。實際專案中優先使用內建 imageflip() 或 Imagick 以獲得更好效能與程式碼可維護性。