- vừa được xem lúc

Quản lý ảnh trên Laravel đơn giản với Intervention Image

0 0 42

Người đăng: Trinh Thai Long

Theo Viblo Asia

1 Mở đầu

Để tạo chức năng quản lý ảnh trên Laravel, chúng ta sử dụng library Intervention Image. Dưới đây, tôi xin giới thiệu các sử dụng Library này.

2 Nội dung

2.1 Điều kiện tiền đề

・Base image(Height 42px Width123px Backgroud White). Kết hợp text và image đã upload.

・Image đã upload đã được resize để matching với base image

2.2 Chuẩn bị mẫu

・Kết hợp text vào chiều dọc

・Kết hợp text vào chiều ngang

・Chỉ kết hợp text

Chuẩn bị

Trước tiên chúng ta sẽ instal library Intervention Image

Command :

 composer require intervention/image

※ Nếu Laravel version 5.4 trở xuống, sẽ không có Package Auto-Discovery, vì vậy chúng ta phải instal package bằng tay tại config/app.php

Khi thêm setting vào app.php↓

'providers' => [ Intervention\Image\ImageServiceProvider::class
]
'aliases' => [ 'Image' => Intervention\Image\Facades\Image::class
]

※Symbolic link đã được gắn sẵn

2 Code

Ngay lập tức có thể sử dụng library : Intervention Image

Xử lý cần thiết :

1.Định nghĩa giá trị tọa độ của Logo・Text và Size

2.Load base image

3.Tạo tham số resize image và text

4.Chỉ kết hợp text

5.Kết hợp Text image theo chiều ngang. dọc

6.Xử lý theo yêu cầu từ phía Client

Việc xử lý ảnh sẽ xử lý tại : ImageDomain để ngăn việc controller bị cồng kềnh

2.1 Định nghĩa giá trị tọa độ của Logo・Text và Size

Trước tiên định nghĩa const để cho tọa độ, size phù hợp với Base image(Height 42px Width123px Backgroud White)

 //Tọa độ của Logo・Text const COORDINATES = [ 'logoCenterX' => 0, 'logoCenterY' => 5, 'logoLeftX' => 5, 'logoLeftY' => 0, 'textCenterX' => 61, 'textCenterY' => 37, 'textLeftX' => 77, 'textLeftY' => 21, 'textOnlyX' => 61, 'textOnlyY' => 21, ]; //Định nghĩa size logo sẽ thực hiện resize const RESIZE_LOGO_SIZE = [ 'widthLeft' => 27, 'heightLeft' => 27, 'widthCenter' => 37, 'heightCenter' => 15, ];

2.2 Load base image

Save base image tại path xác định rồi sau đó chỉ việc, load call nó ra thôi nhé ! Đối với library Intervention Image, Có thể load image bằng hàm Image::make(***); Make - Intervention Image : Hỗ trợ rất nhiều định dạng

 public static function common(): array { //Gọi Image default (White background) $whiteBackground = storage_path('app/public/sample/default.png'); $default = Image::make($whiteBackground); //Định nghĩa path sẽ save image  $save_path = storage_path('app/public/sample/image.png'); return [$default, $save_path]; }

2.3 Tạo tham số resize image và text

Do sau này sẽ sử dụng lại nhiều lần, tại đây chúng ta sẽ tạo tham số resize

ImageDomain.php public static function resizedLogoText($request): array { //Resize logo image phía client đã upload $upload_image = $request->file('sample_image'); $logoImage = Image::make($upload_image); //Thêm logo và Company name đã resize vào base image $uploadClientName = $request->input('sample_text'); return [$logoImage, $uploadClientName]; }

2.4 Trường hợp chỉ kết hợp text

Quá trình xử lý kết hợp sẽ thực hiện từ bước này. Về text, sẽ tùy thuộc vào số lượng ký tự để thay đổi fontsize .

Tham số trong Intervention Image: file( )・・・Quyết định font sẽ sử dụng. Trong bài viết sử dụng font NotoSansJPを使用 size( )・・・Chỉ định fontsize align( )・・・Chỉ định căn chỉnh theo chiều ngang. Có 3 param : left, center, right valign( )・・・Chỉ định căn chỉnh theo chiều dọc。Có 3 param : top, middle, bottom save( )・・・Save

 public static function onlyText($request) { [$default, $save_path] = self::common($request); $uploadClientName = $request->input('only_text'); $lengthText = mb_strlen($uploadClientName, "UTF-8"); $size = floor(100 / $lengthText); if ($size < 8){ $size = 8; }elseif ($size > 25){ $size = 25; } $onlyText = $default->text($uploadClientName, self::COORDINATES['textOnlyX'], self::COORDINATES['textOnlyY'], function($font) use($size){ $font->file(base_path('public/font/NotoSansJP-Black.otf')); $font->size($size); $font->color('#333333'); $font->align('center'); $font->valign('middle'); }); $imageData = $onlyText->save($save_path); return $imageData; }

2.5 Kết hợp Text image theo chiều ngang, dọc

Cách xử lý không khác nhiều so với pattern số 2.4. Sử dụng các hàm đã khai báo ở trên để thực hiện xử lý resize, kết hợp image + text

Các hàm trong Intervention Image sẽ được sử dụng : resize( )・・・Resize image. Resize(Width, Height) insert( )・・・Insert image. Insert(Image muốn chèn, vị trí, trục ngang, trục dọc)

 public static function imageVertical($request) { list($default, $save_path) = self::common(); list($logoImage, $uploadClientName) = self::resizedLogoText($request); //Resize image đã chọn $resizedCenter = $logoImage->resize(self::RESIZE_LOGO_SIZE['widthCenter'], self::RESIZE_LOGO_SIZE['heightCenter']); //Kết hợp image đã resize trên whitebackground $vertical = $default->insert($resizedCenter, 'top', self::COORDINATES['logoCenterX'], self::COORDINATES['logoCenterY']); $vertical->text($uploadClientName, self::COORDINATES['textCenterX'], self::COORDINATES['textCenterY'], function($font) { $font->file(storage_path('app/public/font/NotoSansJP-Black.otf')); $font->size(8); $font->color('#333333'); $font->align('center'); $font->valign('bottom'); }); $imageData = $vertical->save($save_path); return $imageData; }

2.6 Phân chia xử lý

Lần này, về xử lý hiển thị không được ghi trong bài viết, chúng ta có thể phán đoán và xử lý theo request được gửi lên từ phía Client.

 public function update(Request $request) { if ($request->filled('only_text') === true) { $imageData = ImageDomain::onlyText($request); } else { if ($request->boolean('image') === true) { $imageData = ImageDomain::imageVertical($request); } else { $imageData = ImageDomain::imageSide($request); } }

Nguồn : https://qiita.com/lvn-nishimura/items/9e5f9f731b89c9a03928

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 335

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 420

- vừa được xem lúc

Sử dụng Swagger để xây dựng API documentation

Giới thiệu về Swagger. RESTful API là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web services) để tiện cho việc quản lý các resource.

0 0 1k

- vừa được xem lúc

Ví dụ CRUD với Laravel và Vuejs.

1. Cài đặt Laravel. composer create-project --prefer-dist laravel/laravel vuelaravelcrud. .

0 0 140

- vừa được xem lúc

Một số tips khi dùng laravel (Part 1)

1. Show database query in raw SQL format. DB::enableQueryLog(); // Bật tính năng query logging. DB::table('users')->get(); // Chạy truy vấn bạn muốn ghi log.

0 0 69

- vừa được xem lúc

Inertiajs - Xây dựng Single Page App không cần API

Tiêu đề là mình lấy từ trang chủ của https://inertiajs.com/ chứ không phải mình tự nghĩ ra đâu nhé :v. Lâu lâu rồi chưa động tới Laravel (dự án cuối cùng mình code là ở ver 5.8), thế nên một ngày đẹp trời lượn vào đọc docs ver 8.

0 0 227