Dưới đây là một thư viện PHP được xây dựng theo Hướng Đối Tượng (OOP) bao gồm các chức năng cắt ảnh, thay đổi kích thước, tối ưu hóa và chèn watermark. Bạn có thể sử dụng thư viện này trong các dự án của mình để xử lý hình ảnh một cách dễ dàng

1. Tạo Class ImageProcessor

<?php

class ImageProcessor
{
    private $image;
    private $imageType;

    // Khởi tạo với đường dẫn ảnh
    public function __construct($filename)
    {
        $this->load($filename);
    }

    // Tải ảnh và xác định loại ảnh
    private function load($filename)
    {
        $image_info = getimagesize($filename);
        $this->imageType = $image_info[2];

        switch ($this->imageType) {
            case IMAGETYPE_JPEG:
                $this->image = imagecreatefromjpeg($filename);
                break;

            case IMAGETYPE_GIF:
                $this->image = imagecreatefromgif($filename);
                break;

            case IMAGETYPE_PNG:
                $this->image = imagecreatefrompng($filename);
                break;

            default:
                throw new Exception('Unsupported image type.');
        }
    }

    // Lưu ảnh với chất lượng tùy chọn
    public function save($filename, $imageType = IMAGETYPE_JPEG, $compression = 75, $permissions = null)
    {
        switch ($imageType) {
            case IMAGETYPE_JPEG:
                imagejpeg($this->image, $filename, $compression);
                break;

            case IMAGETYPE_GIF:
                imagegif($this->image, $filename);
                break;

            case IMAGETYPE_PNG:
                imagepng($this->image, $filename);
                break;

            default:
                throw new Exception('Unsupported image type.');
        }

        if ($permissions != null) {
            chmod($filename, $permissions);
        }
    }

    // Lấy chiều rộng ảnh
    public function getWidth()
    {
        return imagesx($this->image);
    }

    // Lấy chiều cao ảnh
    public function getHeight()
    {
        return imagesy($this->image);
    }

    // Thay đổi kích thước ảnh
    public function resize($width, $height)
    {
        $newImage = imagecreatetruecolor($width, $height);

        // Giữ nguyên độ trong suốt cho ảnh PNG và GIF
        if ($this->imageType == IMAGETYPE_GIF || $this->imageType == IMAGETYPE_PNG) {
            imagecolortransparent(
                $newImage,
                imagecolorallocatealpha($newImage, 0, 0, 0, 127)
            );
            imagealphablending($newImage, false);
            imagesavealpha($newImage, true);
        }

        imagecopyresampled(
            $newImage,
            $this->image,
            0,
            0,
            0,
            0,
            $width,
            $height,
            $this->getWidth(),
            $this->getHeight()
        );

        $this->image = $newImage;
    }

    // Cắt ảnh
    public function crop($x, $y, $width, $height)
    {
        $newImage = imagecreatetruecolor($width, $height);

        // Giữ nguyên độ trong suốt cho ảnh PNG và GIF
        if ($this->imageType == IMAGETYPE_GIF || $this->imageType == IMAGETYPE_PNG) {
            imagecolortransparent(
                $newImage,
                imagecolorallocatealpha($newImage, 0, 0, 0, 127)
            );
            imagealphablending($newImage, false);
            imagesavealpha($newImage, true);
        }

        imagecopyresampled(
            $newImage,
            $this->image,
            0,
            0,
            $x,
            $y,
            $width,
            $height,
            $width,
            $height
        );

        $this->image = $newImage;
    }

    // Chèn watermark
    public function addWatermark($watermarkFile, $position = 'bottom-right', $opacity = 50)
    {
        $watermark = new ImageProcessor($watermarkFile);

        // Tính toán vị trí watermark
        switch ($position) {
            case 'top-left':
                $x = 0;
                $y = 0;
                break;

            case 'top-right':
                $x = $this->getWidth() - $watermark->getWidth();
                $y = 0;
                break;

            case 'bottom-left':
                $x = 0;
                $y = $this->getHeight() - $watermark->getHeight();
                break;

            case 'bottom-right':
                $x = $this->getWidth() - $watermark->getWidth();
                $y = $this->getHeight() - $watermark->getHeight();
                break;

            case 'center':
                $x = ($this->getWidth() - $watermark->getWidth()) / 2;
                $y = ($this->getHeight() - $watermark->getHeight()) / 2;
                break;

            default:
                $x = 0;
                $y = 0;
                break;
        }

        // Chèn watermark
        imagecopymerge(
            $this->image,
            $watermark->image,
            $x,
            $y,
            0,
            0,
            $watermark->getWidth(),
            $watermark->getHeight(),
            $opacity
        );
    }

    // Giải phóng bộ nhớ
    public function destroy()
    {
        imagedestroy($this->image);
    }
}

2. Hướng Dẫn Sử Dụng

a. Thay Đổi Kích Thước Ảnh

require 'ImageProcessor.php';

$image = new ImageProcessor('path/to/your/image.jpg');
$image->resize(800, 600);
$image->save('path/to/your/resized_image.jpg');
$image->destroy();

b. Cắt Ảnh

require 'ImageProcessor.php';

$image = new ImageProcessor('path/to/your/image.jpg');
$image->crop(50, 50, 200, 200); // Cắt ảnh từ tọa độ (50,50) với kích thước 200x200
$image->save('path/to/your/cropped_image.jpg');
$image->destroy();

c. Tối Ưu Hóa Ảnh

require 'ImageProcessor.php';

$image = new ImageProcessor('path/to/your/image.jpg');
$image->save('path/to/your/optimized_image.jpg', IMAGETYPE_JPEG, 60); // Giảm chất lượng xuống 60%
$image->destroy();

d. Chèn Watermark

require 'ImageProcessor.php';

$image = new ImageProcessor('path/to/your/image.jpg');
$image->addWatermark('path/to/your/watermark.png', 'bottom-right', 30); // Opacity 30%
$image->save('path/to/your/watermarked_image.jpg');
$image->destroy();

Trong bài viết này, chúng ta sẽ khám phá cách sử dụng lớp ImageProcessor để xử lý ảnh trong PHP. Lớp này cung cấp các chức năng cơ bản như tải ảnh, thay đổi kích thước, cắt ảnh, thêm watermark và lưu ảnh với chất lượng tùy chọn. Hướng dẫn sẽ chi tiết từng bước để bạn có thể dễ dàng áp dụng vào dự án của mình.

1. Khởi Tạo Lớp ImageProcessor

Trước tiên, bạn cần tạo một đối tượng ImageProcessor với đường dẫn đến ảnh bạn muốn xử lý.

$imageProcessor = new ImageProcessor('path/to/image.jpg');

Lớp này sẽ tự động xác định loại ảnh và tải ảnh vào bộ nhớ.

2. Tải Ảnh

Khi khởi tạo, hàm __construct gọi hàm load để tải ảnh và xác định loại ảnh dựa trên định dạng của file (JPEG, GIF, PNG).

private function load($filename)
{
    $image_info = getimagesize($filename);
    $this->imageType = $image_info[2];
    
    switch ($this->imageType) {
        case IMAGETYPE_JPEG:
            $this->image = imagecreatefromjpeg($filename);
            break;
        case IMAGETYPE_GIF:
            $this->image = imagecreatefromgif($filename);
            break;
        case IMAGETYPE_PNG:
            $this->image = imagecreatefrompng($filename);
            break;
        default:
            throw new Exception('Unsupported image type.');
    }
}

3. Thay Đổi Kích Thước Ảnh

Hàm resize giúp bạn thay đổi kích thước ảnh một cách linh hoạt. Đảm bảo giữ nguyên độ trong suốt cho ảnh PNG và GIF.

public function resize($width, $height)
{
    $newImage = imagecreatetruecolor($width, $height);

    if ($this->imageType == IMAGETYPE_GIF || $this->imageType == IMAGETYPE_PNG) {
        imagecolortransparent(
            $newImage,
            imagecolorallocatealpha($newImage, 0, 0, 0, 127)
        );
        imagealphablending($newImage, false);
        imagesavealpha($newImage, true);
    }

    imagecopyresampled(
        $newImage,
        $this->image,
        0,
        0,
        0,
        0,
        $width,
        $height,
        $this->getWidth(),
        $this->getHeight()
    );

    $this->image = $newImage;
}

4. Cắt Ảnh

Hàm crop cho phép bạn cắt một phần của ảnh. Tương tự như với resize, bạn cần giữ nguyên độ trong suốt cho ảnh PNG và GIF.

public function crop($x, $y, $width, $height)
{
    $newImage = imagecreatetruecolor($width, $height);

    if ($this->imageType == IMAGETYPE_GIF || $this->imageType == IMAGETYPE_PNG) {
        imagecolortransparent(
            $newImage,
            imagecolorallocatealpha($newImage, 0, 0, 0, 127)
        );
        imagealphablending($newImage, false);
        imagesavealpha($newImage, true);
    }

    imagecopyresampled(
        $newImage,
        $this->image,
        0,
        0,
        $x,
        $y,
        $width,
        $height,
        $width,
        $height
    );

    $this->image = $newImage;
}

5. Thêm Watermark

Hàm addWatermark giúp bạn chèn watermark vào ảnh tại các vị trí khác nhau như góc trên cùng trái, góc dưới cùng phải, hay giữa ảnh.

public function addWatermark($watermarkFile, $position = 'bottom-right', $opacity = 50)
{
    $watermark = new ImageProcessor($watermarkFile);
    
    switch ($position) {
        case 'top-left':
            $x = 0;
            $y = 0;
            break;
        case 'top-right':
            $x = $this->getWidth() - $watermark->getWidth();
            $y = 0;
            break;
        case 'bottom-left':
            $x = 0;
            $y = $this->getHeight() - $watermark->getHeight();
            break;
        case 'bottom-right':
            $x = $this->getWidth() - $watermark->getWidth();
            $y = $this->getHeight() - $watermark->getHeight();
            break;
        case 'center':
            $x = ($this->getWidth() - $watermark->getWidth()) / 2;
            $y = ($this->getHeight() - $watermark->getHeight()) / 2;
            break;
        default:
            $x = 0;
            $y = 0;
            break;
    }
    
    imagecopymerge(
        $this->image,
        $watermark->image,
        $x,
        $y,
        0,
        0,
        $watermark->getWidth(),
        $watermark->getHeight(),
        $opacity
    );
}

6. Lưu Ảnh

Sử dụng hàm save để lưu ảnh sau khi đã thực hiện các thay đổi. Bạn có thể chỉ định chất lượng nén và quyền truy cập file.

public function save($filename, $imageType = IMAGETYPE_JPEG, $compression = 75, $permissions = null)
{
    switch ($imageType) {
        case IMAGETYPE_JPEG:
            imagejpeg($this->image, $filename, $compression);
            break;
        case IMAGETYPE_GIF:
            imagegif($this->image, $filename);
            break;
        case IMAGETYPE_PNG:
            imagepng($this->image, $filename);
            break;
        default:
            throw new Exception('Unsupported image type.');
    }

    if ($permissions != null) {
        chmod($filename, $permissions);
    }
}

7. Giải Phóng Bộ Nhớ

Cuối cùng, đừng quên giải phóng bộ nhớ khi bạn đã hoàn tất xử lý ảnh bằng cách gọi hàm destroy.

public function destroy()
{
    imagedestroy($this->image);
}

Kết Luận

Với lớp ImageProcessor, bạn có thể dễ dàng thực hiện các thao tác xử lý ảnh cơ bản trong PHP như thay đổi kích thước, cắt ảnh, thêm watermark và lưu ảnh với chất lượng tùy chỉnh. Bằng cách làm theo hướng dẫn từng bước trên, bạn sẽ có khả năng kiểm soát tốt hơn việc xử lý ảnh trong các dự án PHP của mình.