Chúng ta có thể thay đổi kích thước của hình ảnh JPEG bằng cách giải mã và mã hóa lại không?


12

Tôi muốn chuyển đổi hình ảnh JPEG 640x480 thành 320x240. Tôi biết nó có thể được thực hiện bằng cách giải mã hình ảnh JPEG thành YCbCr thô, chia tỷ lệ và mã hóa lại thành JPEG. Nhưng có thể với mã hóa JPEG để trực tiếp thu nhỏ hình ảnh mà không cần giải mã?

Câu trả lời:


14

Bạn có thể, nhưng chỉ khi trình xem JPEG của bạn hỗ trợ tiện ích mở rộng JPEG SmartScale . jpegtran có thể làm điều này với kích thước N / 8, với N = 1..16. Về cơ bản, kích thước khối DCT được thay đổi từ 8x8 sang một thứ khác trong quá trình nén lại (ví dụ: 4 x 4), giúp thu nhỏ hình ảnh một cách hiệu quả.

Lưu ý: SmartScale được giới thiệu trong phiên bản 8 của thư viện libjpeg, nhưng nó không được người xem ủng hộ rộng rãi.

Một tài liệu mô tả các thay đổi chi tiết có thể được tìm thấy ở đây: Evolution of JPEG .

EDIT: Có vẻ như hầu hết người xem thực sự không thể hiển thị những hình ảnh này, vì chúng dựa trên libjpeg-turbo. Và libjpeg-turbo đã chọn không thực hiện tính năng này . Trên thực tế, tôi đã thử khá nhiều chương trình (trên Ubuntu 14.04 và Windows 8) và không có chương trình nào có thể hiển thị hình ảnh được thu nhỏ được tạo bằng jpegtrans. Ngay cả Photoshop, IrfanView và GIMP đều thất bại.

EDIT 2: Trên thực tế, Ubuntu và Fedora thậm chí không gửi thư viện libjpeg8, mà thay thế hoàn toàn bằng phiên bản libjpeg-turbo. Vì vậy, không có chương trình nào có thể đọc các tệp JPEG SmartScale, lưu cho một vài tệp nhị phân được liên kết tĩnh với thư viện libjpeg8 ban đầu.


Có một codec xây dựng hình ảnh phát triển chỉ bằng cách nối thêm dữ liệu vào hình ảnh?
Necktwi

những gì về jpeg tiến bộ? Nó không làm chính xác những gì tôi đang hỏi?
Necktwi

Không, điều đó làm một cái gì đó hơi khác bằng cách tăng chất lượng của hình ảnh (từ thấp đến đầy đủ), nhưng độ phân giải luôn không thay đổi ( tham khảo ). Tuy nhiên, có một phần mở rộng JPEG khác gọi là "chế độ phân cấp", mã hóa các độ phân giải khác nhau ( xem thêm tại đây ). Nhưng một lần nữa, libjpeg-turbo không hỗ trợ nó (xem tại đây , tìm kiếm "lũy tiến" trong văn bản).
jmiserez

1
Và để trả lời bình luận đầu tiên, tất nhiên có những codec như vậy. Chỉ không JPG. Những gì bạn đang tìm kiếm được gọi là một kim tự tháp hình ảnh, hoặc đại diện nhiều tầng. Ví dụ JPEG2000 sử dụng biến đổi wavelet tạo ra kim tự tháp wavelet. Có những kim tự tháp khác, chẳng hạn như kim tự tháp Gaussian hoặc Laplacian. Bản trình chiếu này cung cấp một cái nhìn tổng quan tốt về cách mọi thứ hoạt động, trong khi JPEG2000 được thảo luận ở đâyở đây .
jmiserez

Cảm ơn thông tin về các định dạng JPEG mới. Tôi không mong đợi nhiều hình ảnh nguồn (máy ảnh, máy quét, v.v.) sẽ sử dụng chúng.
AFH

3

Câu trả lời ngắn gọn là không. Một hình ảnh JPEG sử dụng nén, có nghĩa là mỗi byte đầu ra phụ thuộc vào tất cả các byte khác. Nếu bạn thay đổi số byte hình ảnh, thì bạn phải giải nén và giải nén.

Sẽ có sự mất chất lượng do quá trình nén lại, vì JPEG sử dụng nén mất dữ liệu, nhưng dù sao bạn cũng đang giảm chất lượng bằng cách chia độ phân giải. Bạn có thể có được chất lượng tốt nhất có thể từ hình ảnh có độ phân giải thấp bằng cách tăng mức chất lượng JPEG khi giải nén, mặc dù điều này tất nhiên sẽ làm tăng kích thước tệp.

Nếu bạn làm việc nhiều với hình ảnh, tốt nhất là làm việc ở định dạng nén không mất dữ liệu, chẳng hạn như PNG, chỉ chuyển đổi thành JPEG khi hình ảnh được hoàn thiện, tất nhiên là bạn có thêm dung lượng đĩa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.