首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP GD 庫實現圖片翻轉(鏡像)效果完整教程

     編輯:PHP 綜合知識

前言

PHP GD 擴展提供了強大的圖像處理能力。本文詳細講解如何使用 imagecopy() 函數實現圖片沿 X 軸(上下翻轉)與 Y 軸(左右鏡像)的翻轉效果,並提供完整可執行代碼。

核心原理

imagecopy() 可將源圖像的一部分複製到目標畫布。翻轉的本質是:按像素列/行逆序複製。

  • Y 軸翻轉(左右鏡像):從源圖最右列開始,依次複製到目標圖最左列。
  • X 軸翻轉(上下翻轉):從源圖最底行開始,依次複製到目標圖最頂行。

完整代碼實現

<?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() 釋放記憶體,避免洩漏。

擴展:支援 JPEG / GIF / WebP

將 imagecreatefrompng 替換為對應函數(imagecreatefromjpeg、imagecreatefromgif、imagecreatefromwebp),輸出時用 imagejpeg、imagegif、imagewebp 即可。建議封裝為統一介面,自動偵測 MIME 類型。

效能提示

逐像素複製效率較低。大圖或高頻場景建議:

  • 使用 imageflip()(PHP 5.5+ 內建,支援 IMG_FLIP_HORIZONTAL / IMG_FLIP_VERTICAL / IMG_FLIP_BOTH)。
  • 或改用 Imagick 擴展:$im->flipImage() / $im->flopImage()。

總結

掌握 imagecopy() 的座標映射邏輯,不僅能實現翻轉,還能延伸至裁剪、縮放、水印、拼圖等所有像素級操作。實際專案中優先使用內建 imageflip() 或 Imagick 以獲得更好效能與程式碼可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved