0
0
Lập trình
TT

Xây dựng bộ nén hình ảnh phía client trong 5 phút

Đăng vào 3 tháng trước

• 4 phút đọc

Hướng dẫn xây dựng bộ nén hình ảnh phía client trong 5 phút

Giới thiệu

Trong thời đại số, việc tối ưu hóa hình ảnh là điều cần thiết để cải thiện tốc độ tải trang và trải nghiệm người dùng. Bài viết này sẽ hướng dẫn bạn cách xây dựng một bộ nén hình ảnh ngay trong trình duyệt mà không cần máy chủ, sử dụng một SDK nhỏ gọn. Chỉ với một đoạn mã, bạn có thể nén hình ảnh với các định dạng như JPEG, WEBP, và PNG, đồng thời hỗ trợ kích thước mục tiêu và chất lượng tự động.

Những gì chúng ta sẽ xây dựng

Chúng ta sẽ tạo ra một trang web đơn giản cho phép người dùng:

  • Chọn một hình ảnh
  • Chọn kích thước và định dạng mong muốn
  • Nhấn nút “Nén”
  • Xem trước kết quả và tải về

Tại sao nên nén hình ảnh phía client?

1. Quyền riêng tư

Hình ảnh không bao giờ rời khỏi thiết bị của người dùng, giúp bảo vệ thông tin cá nhân.

2. Tốc độ

Phản hồi ngay lập tức mà không cần phải chờ đợi mạng hoặc máy chủ.

3. Đơn giản

Không cần máy chủ, không có hàng đợi hay giới hạn tốc độ.

Thêm SDK

Để bắt đầu, bạn cần thêm đoạn mã sau vào trang HTML của mình. Đoạn mã này được lưu trữ bởi ImgSmaller:

html Copy
<script src="https://imgsmaller.com/sdk/imgsmaller.js"></script>

SDK này sẽ cung cấp một đối tượng toàn cục: ImgSmaller.SDK với một phương thức chính là compress.

Thêm HTML cơ bản

Chúng ta cần một input để tải lên tệp, một số điều khiển và một nơi để xem trước kết quả.

html Copy
<input type="file" id="fileInput" />
<button id="compressBtn">Nén</button>
<div id="preview"></div>

Kết nối JavaScript

Bây giờ, chúng ta sẽ thêm một vài dòng JavaScript để tải hình ảnh, nén nó và hiển thị bản xem trước:

javascript Copy
const fileInput = document.getElementById('fileInput');
const compressBtn = document.getElementById('compressBtn');
const previewDiv = document.getElementById('preview');

compressBtn.addEventListener('click', async () => {
    const file = fileInput.files[0];
    const res = await ImgSmaller.SDK.compress(file, {
        targetKB: 80,
        mime: 'image/webp',
        width: 1280,
        auto: true,
        background: '#fff'
    });
    const img = document.createElement('img');
    img.src = URL.createObjectURL(res);
    previewDiv.innerHTML = '';
    previewDiv.appendChild(img);
});

Tùy chỉnh đầu ra

Bạn có thể truyền thêm nhiều tùy chọn cho phương thức compress:

  • targetKB: kích thước mong muốn trong KB (mặc định là 100)
  • mime: 'image/jpeg' | 'image/webp' | 'image/png'
  • width, height: kích thước tùy chọn (số)
  • auto: true|false — ưu tiên chất lượng hình ảnh hơn kích thước chính xác
  • background: '#ffffff' (hữu ích cho JPEG khi nguồn có độ trong suốt)

Ví dụ:

javascript Copy
const res = await ImgSmaller.SDK.compress(file, {
    targetKB: 80,
    mime: 'image/webp',
    width: 1280,
    auto: true,
    background: '#fff'
});

Cách hoạt động (cơ chế bên trong)

  • Tải hình ảnh vào Canvas
  • Có thể thay đổi kích thước
  • Chạy một tìm kiếm nhị phân nhanh trên chất lượng để ước lượng kích thước mục tiêu của bạn
  • Tạo ra một Blob + Object URL để xem trước/tải về
  • Tất cả đều trong trình duyệt — không cần gọi máy chủ

Những điều cần lưu ý

  • Hình ảnh rất lớn có thể tốn nhiều bộ nhớ trên các thiết bị cấu hình thấp; hãy xem xét việc thay đổi kích thước trước.
  • PNG là định dạng không mất dữ liệu; “chất lượng” không áp dụng. Sử dụng JPEG/WEBP để nhắm đến kích thước.
  • Hỗ trợ WEBP phụ thuộc vào trình duyệt (hầu hết các trình duyệt hiện đại đều hỗ trợ).

Kết luận

Vậy là bạn đã xây dựng xong một bộ nén hình ảnh phía client chỉ với vài dòng JavaScript. Nếu bạn cần một bộ nén sẵn sàng cho sản xuất với hỗ trợ hàng loạt, các preset KB chính xác và giao diện thân thiện với người dùng, hãy thử ImgSmaller tại imgsmaller.com.

Câu hỏi thường gặp (FAQ)

1. Tôi có thể sử dụng bộ nén này trên tất cả các trình duyệt không?

Có, nhưng hãy kiểm tra tính tương thích với định dạng WEBP trên các trình duyệt mà bạn định hỗ trợ.

2. Có giới hạn kích thước nào cho hình ảnh không?

Có, nhưng nó phụ thuộc vào khả năng bộ nhớ của thiết bị người dùng.

3. Tôi có thể tùy chỉnh chất lượng nén không?

Có, bạn có thể điều chỉnh các tham số như targetKBauto để tối ưu hóa chất lượng.

Thực hành tốt nhất

  • Luôn sử dụng hình ảnh có kích thước phù hợp với thiết bị để giảm tải.
  • Kiểm tra và điều chỉnh các tham số nén để đạt được kết quả tốt nhất.

Cạm bẫy thường gặp

  • Đừng nén hình ảnh quá lớn trên thiết bị yếu, điều này có thể làm treo hoặc giảm hiệu suất ứng dụng.

Tài nguyên tham khảo

Kết nối nội bộ

  • Tìm hiểu thêm về JavaScriptHTML để cải thiện khả năng lập trình của bạn.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào