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.