TL; DR;
Có cách nào để nén hình ảnh (chủ yếu là jpeg, png và gif) trực tiếp phía trình duyệt trước khi tải lên không? Tôi khá chắc rằng JavaScript có thể làm được điều này, nhưng tôi không thể tìm ra cách để đạt được nó.
Đây là toàn bộ kịch bản mà tôi muốn thực hiện:
- người dùng truy cập trang web của tôi và chọn một hình ảnh thông qua một
input type="file"
phần tử, - hình ảnh này được truy xuất qua JavaScript, chúng tôi thực hiện một số xác minh chẳng hạn như định dạng tệp chính xác, kích thước tệp tối đa, v.v.,
- nếu mọi thứ đều ổn, bản xem trước của hình ảnh sẽ được hiển thị trên trang,
- người dùng có thể thực hiện một số thao tác cơ bản như xoay hình ảnh 90 ° / -90 °, cắt hình ảnh theo tỷ lệ được xác định trước, v.v. hoặc người dùng có thể tải lên một hình ảnh khác và quay lại bước 1,
- Khi người dùng hài lòng, hình ảnh đã chỉnh sửa sau đó sẽ được nén và "lưu" cục bộ (không được lưu vào tệp, mà trong bộ nhớ / trang của trình duyệt), -
- người dùng điền vào biểu mẫu với dữ liệu như tên, tuổi, v.v.,
- người dùng nhấp vào nút "Hoàn tất", sau đó biểu mẫu chứa dữ liệu + hình ảnh nén được gửi đến máy chủ (không có AJAX),
Toàn bộ quy trình cho đến bước cuối cùng phải được thực hiện ở phía máy khách và phải tương thích trên Chrome và Firefox, Safari 5+ và IE 8+ mới nhất . Nếu có thể, chỉ nên sử dụng JavaScript (nhưng tôi khá chắc chắn rằng điều này là không thể).
Tôi chưa viết bất cứ thứ gì ngay bây giờ, nhưng tôi đã nghĩ về nó rồi. Có thể đọc tệp cục bộ thông qua API tệp , xem trước và chỉnh sửa hình ảnh có thể được thực hiện bằng cách sử dụng phần tử Canvas , nhưng tôi không thể tìm thấy cách thực hiện phần nén hình ảnh .
Theo html5please.com và caniuse.com , việc hỗ trợ những trình duyệt này khá khó khăn (nhờ IE), nhưng có thể được thực hiện bằng cách sử dụng polyfill như FlashCanvas và FileReader .
Thực ra, mục đích là giảm dung lượng tệp, vì vậy tôi xem nén ảnh là một giải pháp. Nhưng, tôi biết rằng hình ảnh đã tải lên sẽ được hiển thị trên trang web của tôi, mọi lúc ở cùng một vị trí và tôi biết kích thước của vùng hiển thị này (ví dụ: 200x400). Vì vậy, tôi có thể thay đổi kích thước hình ảnh để phù hợp với các kích thước đó, do đó giảm kích thước tệp. Tôi không biết tỷ lệ nén cho kỹ thuật này sẽ như thế nào.
Bạn nghĩ sao ? Bạn có lời khuyên nào nói cho tôi biết không? Bạn có biết cách nào để nén hình ảnh phía trình duyệt trong JavaScript không? Cảm ơn cho câu trả lời của bạn.