2009-02-12 28 views
21

JPEG là một chương trình nén mất dữ liệu, vì vậy việc giải nén-giải nén-recompression thường làm giảm chất lượng hình ảnh hơn nữa cho mỗi bước. Có thể xoay hình ảnh JPEG mà không bị mất thêm không? Từ những gì ít tôi biết về thuật toán JPEG, nó ngây thơ có vẻ như có thể tránh mất thêm với một chút nỗ lực. Các chương trình thao tác hình ảnh phổ biến nào (ví dụ: GIMP, Paint Shop Pro, Thư viện ảnh Windows) và thư viện đồ họa gây ra mất chất lượng khi thực hiện xoay vòng và điều gì không?Có thể xoay ảnh JPEG được nén mà không làm mất chất lượng không?

Trả lời

6

Có, có thể xảy ra đối với một số trường hợp nhất định: Xoay 90 độ và lật trên hình ảnh có kích thước là bội số của 8. Tâm của thuật toán JPEG - phần mất - liên quan đến việc phá vỡ hình ảnh thành các khối 8x8 pixel, thực hiện một khối discrete cosine transform trên khối và sau đó lượng tử hóa kết quả. Ngoài ra còn có một số chuyển đổi không gian màu và nén không bị mất của các khối trên đầu trang này. các hệ số cơ bản giống nhau, nhưng có thể được chuyển đổi và/hoặc với một số thay đổi dấu hiệu tùy thuộc vào phép biến đổi, do đó, các bước cơ bản để xoay hoặc lật hình ảnh sẽ mất liên quan:

  1. Decompress và giải nén các khối
  2. Transpose và/hoặc dấu lật các hệ số DCT cho mỗi khối
  3. cải tổ các khối vào đơn hàng mới của họ (nếu không các khối 8x8 sẽ được luân chuyển nhưng vẫn ở vị trí cũ)
  4. Giải nén tất cả bằng các bước nén không bị mất.
+2

Có một thư viện java mà thực hiện điều này? –

9

Tuyệt đối - chỉ cần thay đổi giá trị định hướng trong dữ liệu EXIF. Phần lớn các chương trình hình ảnh sẽ tôn trọng cài đặt này và hiển thị hình ảnh "xoay".

Cũng có thể "thủ công" (ví dụ: lập trình) xoay hình ảnh theo kiểu không mất thời gian nếu tiêu chí nhất định là đúng - xoay phải là 90/180 độ và chiều rộng/chiều cao phải là bội số của khối. Bạn cũng có thể lật/gương nó. Tôi không biết liệu các chương trình hình ảnh có đủ thông minh cho trường hợp đặc biệt hoạt động này hay không. Tôi đoán là không.

+0

Bạn có thể "thủ công" thực hiện phép chuyển đổi không bị mất 90-180-270 với jpeg. – xpda

+1

thay đổi Exif của hình ảnh sẽ không làm bất kỳ điều gì với chính dữ liệu và một số người xem hình ảnh không xử lý tốt.cộng thêm, khó chơi hơn một chút trong trường hợp bạn muốn sửa đổi hình ảnh, vì bạn phải xem xét định hướng ... –

2

Không phải chuyên gia jpg, nhưng có vẻ như câu trả lời sẽ là Có cho 90, 180, 270 độ quay. (có thể ngay cả đối với 360! :))

+4

360 có thể thực hiện được, nhưng 720 mất nhiều kỹ năng hơn – Javier

+1

Thật khó! Chỉ cần làm 360 hai lần. –

+2

@Assaf, khoảng 1080? – Aardvark

2

Có, điều đó là có thể.
Tìm kiếm nhanh trên google cung cấp danh sách các chương trình này which do this

+0

Bạn có biết thư viện nào làm việc đó không? –

0

Nếu bạn đang nói về xoay ảnh JPEG thì không có quyền nén tiếp theo nào? Đó là về xoay vị trí pixel.

Thực hiện xoay vòng với bất kỳ chương trình nào có khả năng sẽ thay đổi thứ nguyên trung gian, vì nó cần phải quản lý hình ảnh gốc, đây có thể là vấn đề cần cân nhắc.

0

Trừ khi bạn xoay theo bội số của 90 độ thì hình ảnh của bạn sẽ phải thực hiện một số loại nội suy có thể làm giảm chất lượng hình ảnh của bạn. Sử dụng thuật toán nội suy tốt sẽ giúp ích ở đây.

Để mở và nén lại, tôi không chắc chắn bạn sẽ thực sự có chất lượng kém hơn hay không, nhưng sau đó tôi không chắc chính xác cách thức hoạt động của JPEG.

Tôi khuyên bạn nên cố nén, thao tác và nén lại và tự mình xem nếu kết quả đủ tốt. Điều gì là đủ tốt là tùy thuộc vào ứng dụng của bạn.

+1

Mở và nén lại, đặc biệt là nhiều lần, chắc chắn sẽ dẫn đến chất lượng kém hơn. Đây là một điểm yếu cơ bản của việc nén không mất dữ liệu. (Có hay không nó là tồi tệ hơn, đủ để chăm sóc chắc chắn là chủ quan như bạn đề nghị.) –

8

Từ JPEG FAQ:

"Có một vài chuyên hoạt động có thể được thực hiện trên một tập tin JPEG mà không cần giải nén nó, và do đó mà không bị mất thế hệ mà bạn muốn thường nhận được từ tải và tái lưu hình ảnh trong trình chỉnh sửa hình ảnh thông thường. Trong cụ thể là có thể thực hiện quay 90 độ và lật không cần thiết, nếu kích thước hình ảnh là bội số của khối của tệp là kích thước (thường là 16x16, 16x8 hoặc 8x8 pixel đối với các ảnh JPEG màu).
...

Nhưng bạn cần phần mềm đặc biệt; xoay hình ảnh trong trình chỉnh sửa hình ảnh thông thường sẽ không bị mất dữ liệu."

13

Có một chương trình có tên jpegtran

jpegtran - một tiện ích cho lossless chuyển mã giữa các định dạng JPEG khác nhau.

Here is a list of applications which provide the JPEG lossless rotation feature based on the IJG code

+0

Lưu ý: gói tương ứng có tên 'libjpeg-turbo' trên ArchLinux. – VasyaNovikov

+0

CẢNH BÁO: Tôi cũng phát hiện ra rằng jpegtran _can trên thực tế_ mất chất lượng. Nó có thể xảy ra với jpeg mà kích thước không thể chia hết cho 16. Nhận xét từ việc biết mọi người chào đón. – VasyaNovikov

1

Theo bài báo xuất sắc trên Understanding Digital Image Interpolation bởi Sean McHugh:

Interpolation cũng xảy ra mỗi khi bạn xoay hoặc bóp méo hình ảnh. (...) Xoay 90 ° là không tổn hao vì không có pixel nào phải được định vị lại vào đường viền giữa hai pixel (và do đó được chia).

và cuối cùng kết thúc với

tránh xoay hình ảnh của bạn khi có thể; nếu ảnh chưa được chỉnh sửa yêu cầu, xoay vòng không quá một lần.

0

Nếu nó có thể giúp:

Đang cố gắng để làm tốt hơn so với Microsoft (Windows 7) xem hình ảnh tự nhiên và tùy chọn xoay vòng nhấp chuột phải của nó, tôi đã thử một số ứng dụng của liên kết sau: http://jpegclub.org/losslessapps.html

Ví dụ, tôi đã thử FastStone Image Viewer, XnView, Photosurfer, JPEG Lossless Rotator, Trình xem ảnh ExifPro.

KHÔNG có ảnh nào mang lại hình ảnh lớn hơn trình xem ảnh cơ bản của Windows 7 sau khi xoay 90 ° đơn giản. Đó là thừa nhận giới hạn để kết luận quá nhanh, nhưng tôi vẫn chưa tìm thấy một ứng dụng xoay .jpeg không mất dữ liệu thực sự cho thời điểm này, và trong mọi trường hợp không tốt hơn so với Windows tích hợp sẵn.

Các vấn đề liên quan