Làm cách nào để thêm đường viền vào ảnh JPEG mà không ảnh hưởng đến chất lượng?


24

Tôi có một bức ảnh ở định dạng JPEG với độ phân giải 4680x3120. Tôi muốn thêm một viền trắng xung quanh ảnh này, biến nó thành ảnh 5200x3467 (vì lý do in).

Rõ ràng, tôi không thay đổi hoặc loại bỏ bất cứ điều gì khỏi bức ảnh, tôi chỉ đơn giản là thêm một cái gì đó. Do đó, về nguyên tắc thủ tục này có thể được mất. Tuy nhiên, nếu tôi sử dụng Paint để thêm viền này, quy trình Lưu của Paint sẽ nén ảnh lại thành định dạng JPEG, do đó làm mất thông tin và chất lượng.

Có cách nào (một số chương trình chuyên nghiệp hơn) để thêm một cái gì đó vào ảnh JPEG, như đường viền, mà không ảnh hưởng đến phần gốc của ảnh, mà không làm giảm chất lượng của nó không?

Câu trả lời:


35

Mặc dù câu trả lời của Philip là cách tốt nhất để đi, nhưng có thể làm những gì bạn muốn hoàn toàn trong phạm vi JPEG.

JPEG hoạt động bằng cách chia hình ảnh của bạn thành các khối được gọi là Đơn vị mã hóa tối thiểu (MCU), thường là 16 × 16 mỗi khối và nén chúng riêng rẽ. Bạn có thể thấy điều này trong hình ảnh khi bạn quay mức nén lên rất cao. Ở các mức nén hợp lý hơn, các khối kết hợp với nhau trơn tru đến mức bạn không bao giờ nhìn thấy các đường viền.

Chúng ta có thể tận dụng thực tế này để thêm một cách dễ dàng một đường viền trắng đơn giản vào hình ảnh. Chúng ta chỉ cần tạo một mảng rỗng của các khối trắng bằng kích thước hình ảnh đầu ra, sau đó thả các khối JPEG MCU ban đầu vào giữa.

Có một nhược điểm của kỹ thuật đó: nó chỉ hoạt động khi kích thước hình ảnh đầu vào và đầu ra đều là bội số của kích thước MCU. Khi đó không phải là trường hợp, chúng ta cần phải giải nén một số khối ở lề giữa viền trắng và các cạnh của ảnh gốc. Bạn sẽ không thấy sự khác biệt này ở đầu ra nếu bạn tránh xa các mức nén JPEG quá cao, do đó, nó vẫn không bị mất hiệu quả .

Tôi không biết bất kỳ chương trình nào chỉ làm điều này. Điều gần nhất mà tôi biết là một thao tác nghịch đảo: jpegtran có chức năng cắt xén giúp cắt bỏ các phần của các cạnh hình ảnh một cách dễ dàng bằng cách loại bỏ các MCU bị cắt xén dọc theo các cạnh hình ảnh, để lại các phần tử bên trong không bị ảnh hưởng

Giải pháp làm sẵn đơn giản nhất mà tôi biết là plugin JPEG lossless Resave tốt hơn cho Photoshop. Nó sử dụng các kỹ thuật dựa trên các ý tưởng được đưa ra ở trên để sao chép MCU từ hình ảnh gốc bất cứ nơi nào có thể, để tránh tạo lại chúng từ phiên bản không nén, như Photoshop thường làm.


Lạc đề:

  1. Bạn có thể nghĩ rằng đường viền kết quả sẽ không hoàn toàn trắng , vì sự mất mát của JPEG sẽ tạo ra một số loại khác biệt màu sắc ở đầu ra. Tôi đã thực hiện một số thử nghiệm và ít nhất là trong Photoshop, một hình ảnh hoàn toàn trắng được lưu thông qua Save 10 Web của Save For Web (nghĩa là "chất lượng thấp") dẫn đến hình ảnh được giải mã vẫn hoàn toàn là màu trắng.

    Tôi xác định điều này với hai bài kiểm tra:

    Đầu tiên, tôi đã tải JPEG dưới dạng một lớp lên trên bản gốc, đặt chế độ hòa trộn của lớp trên cùng thành Sự khác biệt, sau đó thêm một lớp điều chỉnh Levels phía trên nó để thử và phóng to sự khác biệt. Hình ảnh thu được giữ nguyên màu đen, biểu thị "không có sự khác biệt".

    Thứ hai, khi tôi không thấy được sự khác biệt dự kiến, tôi bỏ lớp điều chỉnh và trả lại lớp JPEG về chế độ hòa trộn Bình thường, chọn công cụ Eyedropper và nhìn khắp hình ảnh cho một pixel không hiển thị dưới dạng RGB (255,255,255 ) trong bảng Thông tin. Tôi không bao giờ tìm thấy một. Tôi dự kiến ​​sẽ thấy các con số nhấp nháy một chút khi tôi lướt qua hình ảnh, nhưng chúng vẫn ổn định.

    Tôi chỉ có thể kết luận rằng đây là trường hợp suy biến của thuật toán mã hóa: các khối trắng tinh khiết giữ nguyên màu trắng thông qua biến đổi cosine rời rạc .

    Thật thú vị, điều này không xảy ra với các khối màu đen thuần túy. Ít nhất với việc triển khai Photoshop, chúng biến thành RGB (1,1,1) khi được giải mã, không phải RGB (0,0,0).

    Tóm lại, bạn không cần phải lo lắng về các chấm rải rác ở khu vực viền này khi in một hình ảnh được tạo ra bằng kỹ thuật trên.

  2. jpegtranlà một chương trình dòng lệnh, nhưng cũng có một chương trình GUI Windows dựa trên cùng một mã được gọi jpegcrop.

  3. Than ôi, plugin này chỉ dành cho Windows.


1
Tôi đã sử dụng một chương trình có tên JPEG Wizard cung cấp chức năng như vậy. Nó cũng có một khả năng rất hay để áp dụng các tỷ lệ nén khác nhau cho các phần khác nhau của JPEG. Do đó, người ta có thể sử dụng cài đặt chất lượng cao cho đầu và tay của một người, chất lượng trung bình cho quần áo của họ và chất lượng thấp hơn cho nền, và do đó kết thúc với một tệp nhỏ hơn nhưng chất lượng tổng thể tốt hơn so với khi người ta sử dụng chất lượng trung bình cho mọi thứ.
supercat

1
Tôi đã không có cơ hội để thử nó, nhưng bài đăng trên blog này cho thấy jpegtranchức năng cắt xén thực sự cũng có thể được sử dụng để mở rộng. (Tuy nhiên, không chắc màu viền mở rộng là màu gì.)
mattdm

4
@mattdm: Có, jpegtrancũng có thể mở rộng hình ảnh, nhưng nó luôn luôn đệm với màu xám trung bình được mã hóa cứng, RGB (128,128,128). Nó thực hiện điều đó đơn giản vì đó là tùy chọn dễ dàng duy nhất, vì trong không gian hệ số DCT, bạn có thể thực hiện bằng một bzero()cuộc gọi đơn giản . Tôi đã thử một cách hack hoang dã để thay đổi điều này , nó không hoạt động, nhưng sẽ cho bạn cảm giác về sự xấu xí liên quan. giơ tay lên trong thất vọng
Warren Young

@WarrenYoung: Để thay đổi màu của các khối đệm, có lẽ bạn chỉ cần thay đổi hệ số (DC) đầu tiên và để các khối khác ở mức 0. Tất nhiên, các hệ số được nén, vì vậy ... dù sao thì cũng nên làm được, nhưng tôi đồng ý rằng nó không tầm thường như vẻ ngoài của nó.
Ilmari Karonen

2
Đến điểm cuối cùng của bạn - số tiền tiết kiệm lớn nhất đến từ việc vứt bỏ thông tin tần số cao. Lợi ích từ việc vứt bỏ độ chính xác về màu sắc của một khối pixel rắn không thể nhiều hơn một hoặc hai byte, do đó, nó không bao giờ hoặc gần như không bao giờ được thực hiện. Nếu có bất kỳ mất thông tin nào, đó là trong chuyển đổi không gian màu YUV <-> RGB.
hobbs 17/03/2015

20

Điểm cần nhớ ở đây là bạn mất chất lượng khi lưu ảnh vào định dạng nén mất dữ liệu. Miễn là bạn lưu ảnh ở định dạng lossless (PSD, TIFF, v.v.) sau khi thêm viền, bạn sẽ không mất bất kỳ dữ liệu nào nhiều hơn số bạn đã mất bằng cách lưu ảnh dưới dạng JPEG ở vị trí đầu tiên.


1
Cảm ơn. Và điều này đúng ngay cả khi sử dụng chương trình 'crappy' như Paint, khi lưu nó vào ví dụ TIFF?
LBogaardt

4
Ít nhất là theo thử nghiệm nhanh của tôi, Paint sử dụng thuật toán nén LZW không mất dữ liệu khi lưu TIFF để nó trông ổn.
Philip Kendall

5
Hãy nhớ rằng điều này có khả năng làm tăng đáng kể kích thước của hình ảnh ...
BlueRaja - Danny Pflughoeft

2
paint cũng hỗ trợ PNG, đây cũng là một định dạng lossless
phuclv 17/03/2015

+1 cho điều này vì các câu trả lời thảo luận về việc lưu lại vào jpeg không tương thích với tất cả các tùy chọn mã hóa jpeg.
James Snell

6

Nó không hoàn toàn mất mát, nhưng bạn có thể trở nên khá gần gũi khi sử dụng GIMP (hoặc một số trình chỉnh sửa khác có tính năng tương tự) và hai thủ thuật sau:

  1. Trước tiên, hãy đảm bảo rằng đường viền bạn thêm là bội số rộng 8 pixel (và tốt nhất là bội số của 16 pixel).

    Điều này rất quan trọng vì thuật toán nén JPEG chia hình ảnh thành các khối pixel 8 × 8 *, bắt đầu từ góc trên cùng bên trái và áp dụng thuật toán nén mất dữ liệu độc lập cho từng khối. Do đó, ít nhất về nguyên tắc, bạn có thể đệm một cách không mất hình ảnh JPEG bằng cách thêm các khối pixel 8 × 8 đầy đủ xung quanh các khối hiện có. Tuy nhiên, nếu bạn đã cố gắng thêm một đường viền không phải là toàn bộ số khối rộng, thì các khối trong hình ảnh được đệm sẽ không khớp với các đường viền trong bản gốc và một số mất mát nén là không thể tránh khỏi.

    *) Trên thực tế, hầu hết các định dạng ảnh JPEG sử dụng chroma mẫu phụ , có nghĩa là chỉ có một phần màu xám của hình ảnh thực sự là nén trong 8 × 8 khối, trong khi các kênh truyền hình chroma được thu nhỏ xuống 50% trước khi nén, làm cho kích thước khối hiệu quả của họ 16 × 16 pixel. Do đó, để có kết quả tốt nhất, chiều rộng đường viền của bạn thực sự phải là bội số của 16 pixel. Tuy nhiên, bạn thường có thể thoát khỏi đường viền pixel 8 (hoặc 24 hoặc 40, v.v.), vì một chút mất nén trong sắc độ là không đáng chú ý.

  2. Phần thứ hai của mẹo là, khi lưu hình ảnh cuối cùng, để chọn hộp kiểm "Sử dụng cài đặt chất lượng từ hình ảnh gốc" trong hộp thoại Xuất hình ảnh dưới dạng JPEG (trong Cài đặt nâng cao). Làm điều này ngay cả khi có vẻ như nó sẽ dẫn đến chất lượng thấp hơn bạn thường sử dụng!

    Cài đặt này làm cho GIMP sử dụng lại chính xác các cài đặt nén như được sử dụng cho ảnh gốc, thường loại bỏ khoảng 99% tổn thất nén, với điều kiện là bạn chưa chỉnh sửa ảnh quá nhiều, và đặc biệt, các khối trong hình ảnh mới vẫn phù hợp với những người trong bản gốc. (Đôi khi vẫn sẽ có một số tổn thất do lỗi vòng, nhưng ít hơn nhiều so với trường hợp khác.)


Để minh chứng nhanh, tôi đã lấy hình ảnh thử nghiệm JPEG này từ Wikimedia Commons , ban đầu được lưu với cài đặt chất lượng khá thấp là 50 và thêm một đường viền đen trắng 8px lạ mắt vào nó bằng phương pháp được mô tả ở trên:

Kiểm tra hình ảnh với đường viền 8px, chủ yếu là lossless

Đây là sự khác biệt giữa ảnh gốc (15,1 kB) và ảnh đã chỉnh sửa (16,7 kB), được hiển thị bằng chế độ lớp "Trích xuất hạt" của GIMP:

Sự khác biệt giữa hình ảnh đệm và bản gốc

Bạn có thể thấy một số lỗi sắc độ rất nhỏ, do độ rộng đường viền không phải là bội số của 16 và (nếu bạn nhìn kỹ) một vài khối trong đó cũng có những tổn thất nhỏ trong kênh luma do bị làm tròn. Tuy nhiên, về mặt trực quan, hình ảnh gốc và hình ảnh đệm đều không thể phân biệt được, thậm chí ở độ phóng đại gấp 2 lần và lật xen kẽ giữa chúng.

Cụ thể, tương phản điều này với kết quả của việc giảm chất lượng JPEG lên từ 50 đến 60 trước khi lưu hình ảnh được đệm, mang lại hình ảnh 17,6 kB sau:

Hình ảnh thử nghiệm với viền 8px, chất lượng được nâng từ 50 lên 60

Ở độ phóng đại cao, bạn chắc chắn có thể thấy rằng hình ảnh được chỉnh sửa mờ rõ rệt ở một số nơi so với bản gốc và việc lấy sự khác biệt với chiết xuất Grain đã xác nhận điều này:

Sự khác biệt giữa hình ảnh đệm (tại q60) và bản gốc


"chọn hộp kiểm này dường như không ảnh hưởng đến cài đặt" Tiến bộ "." Không phải là lỗi, vì mã hóa lũy tiến là cài đặt mã hóa, không phải là cài đặt chất lượng. Jpegtran có thể chuyển đổi hình ảnh sang và từ lũy tiến một cách dễ dàng.
Damian Yerrick 17/03/2015

@tepples: Bạn nói đúng; Tôi đã xóa đoạn đó. Vì một số lý do, tôi đã có ấn tượng rằng việc bật chế độ lũy tiến sẽ khiến các cài đặt chất lượng không khớp, nhưng một thử nghiệm nhanh dường như xác nhận rằng tôi đã sai về điều đó.
Ilmari Karonen 17/03/2015

1
@thomasrutter: Tôi không thể đưa ra nhận xét, vì vậy tôi sẽ chỉ cho bạn bài đăng trên diễn đàn ban đầu mô tả tính năng này và đặc biệt, trích dẫn này: " Nếu bạn chỉ thực hiện một vài thay đổi cho hình ảnh, thì hãy- sử dụng các bảng lượng tử hóa giống nhau sẽ cho bạn chất lượng và kích thước tệp gần như giống nhau như hình ảnh gốc. Điều này sẽ giảm thiểu tổn thất do bước lượng tử hóa gây ra, so với những gì sẽ xảy ra nếu bạn sử dụng các bảng lượng tử hóa khác nhau. "
Ilmari Karonen

1
Chỉ để so sánh, đây là một ví dụ khác trong câu trả lời cho một câu hỏi khác. Sự hiểu biết của tôi về lý thuyết đồng ý với Ilmari nhưng ít nhất trong ví dụ của tôi, thực tế dường như nhiều hơn với những gì Thomas nói - ít nhất là khi bắt đầu với một hình ảnh xuống cấp. (Tôi nghĩ rằng bia mộ là một ví dụ nghèo nàn cho mục đích này, bởi vì việc mất chi tiết trên đá ít rõ ràng hơn so với trên da người.)
mattdm

1
@mattdm: Có vẻ như nó khá phụ thuộc vào phần mềm; Tôi đã thử tái tạo kết quả của bạn từ câu trả lời đó trong GIMP và có vẻ như GIMP (v2.8.10, ít nhất) khá tốt trong việc duy trì chất lượng JPEG so với ImageMagick (bất kỳ phiên bản nào bạn đã thử nghiệm). Hình ảnh đầu tiên của bạn, được lưu một lần tại q75, có PSNR là 34.0298, trong khi hình ảnh được lưu hai lần tại q75 có một trong số chỉ 32.8169 (và một lần được lưu lại 8 lần có PSNR là 32.6459). Để so sánh, việc lưu cùng một hình ảnh nguồn một lần trong GIMP ở q75 cho PSNR là 36,4560; mở và lưu lại nó với cùng chất lượng chỉ giảm một chút, xuống 36.3295.
Ilmari Karonen

3

Xin lỗi nếu đây không chính xác là những gì bạn muốn nhưng ...

Có vẻ như bạn thêm một viền trắng như một trợ giúp để định vị hình ảnh của bạn khi in. Tại sao không tập trung vào việc học các giao diện in đúng cách và tránh những vụ hack tinh ranh như thế này? Vấn đề khác mà vấn đề này đưa ra là bạn cho phép chương trình in thay đổi kích thước hình ảnh 4680x3120 của bạn để phù hợp với độ phân giải / DPI chính xác. Điều này có thể có ảnh hưởng nghiêm trọng hơn so với việc lưu lại một jpeg.


Cả hai điểm hợp lệ, cảm ơn bạn. Tuy nhiên, tôi đã tải ảnh của mình lên một trong những cửa hàng in trực tuyến đó, vì vậy tôi không có quyền kiểm soát máy in thực tế.
LBogaardt

1

Các câu trả lời trước là rất tốt.

Tôi sẽ chỉ thêm một số "khía cạnh tâm lý" của định dạng jpg.

Nếu một jpg được chuẩn bị tốt, nó chỉ mất khoảng 0,5% thông tin. Đó là trong phần lớn các trường hợp một cái gì đó mà mắt người không thể nhìn thấy. Bạn cần một chương trình để thực hiện một số phân tích và thấy sự khác biệt (như phân tích mà Ilmari vừa làm).

"Chất lượng tốt" là một quá trình, không chỉ là cách định dạng tệp lưu hình ảnh. Có, bạn đã nén lại tệp với jpg một lần nữa vì bạn thực sự cần nó. Nếu nó ở trong một tình huống được kiểm soát thì có thể làm điều đó.

Bạn thực sự cần nó ngụ ý rằng bạn không thể sử dụng định dạng lossless khác, bạn có nhu cầu lưu trữ hoặc phần mềm rất cụ thể hoặc quy trình làm việc rất chặt chẽ.

Nếu bạn thực sự lo lắng về chất lượng, có lẽ bạn sẽ không sử dụng Paint. Định dạng JPG có một số cấu hình mà bạn không thể kiểm soát trong Paint.

Dưới đây là danh sách các chương trình miễn phí của tôi, nơi bạn thực sự có thể kiểm soát nén jpg và tùy chọn bạn cần chọn. (Tất cả chúng trong hộp thoại lưu jpg)

Irfanview - Bật Vô hiệu hóa mẫu màu sắc.

Trình xem ảnh FastStone - Lấy mẫu màu: Không có.

Gimp - Lấy mẫu 4: 4: 4

Phần kết luận. Đừng sử dụng Paint.

Một điều tôi chưa kiểm tra. Nếu tất cả các chương trình này duy trì hồ sơ màu nhúng. Tôi sẽ chỉnh sửa bài viết của mình sau.


Có người đã bình chọn -1 cho câu trả lời này. Thông thường tôi không quan tâm vì tôi biết tôi có thể nói điều gì đó ngớ ngẩn. Trong trường hợp cụ thể này, phần nào của câu trả lời là sai?
Rafael

Tôi đã không bỏ phiếu (lên hoặc xuống), nhưng bạn có thể muốn làm việc với chính tả và ngữ pháp của mình để tạo ấn tượng đầu tiên tốt hơn (và cũng thật lòng để làm cho câu trả lời của bạn dễ đọc hơn). Ngoài ra, câu hỏi này đã có một số câu trả lời (và đặc biệt là của tôi, hóa ra khá dài); tại một số điểm, một số người có thể bắt đầu bỏ qua (hoặc ít nhất là không nâng cao) các câu trả lời không rõ ràng thêm một cái gì đó mới cho những câu trả lời hiện có. Ngoài ra, hãy cố gắng cấu trúc câu trả lời của bạn để các bit quan trọng nổi bật trong nháy mắt; trong trường hợp này, phần duy nhất bạn đánh dấu in đậm là một chú thích không quan trọng.
Ilmari Karonen

Cảm ơn bạn đã bình luận của bạn Ilmari. Tôi đang cố gắng suy nghĩ bằng tiếng Anh, vì nó không phải là ngôn ngữ mẹ đẻ của tôi. Tôi sẽ tìm kiếm một công cụ chính tả. Tôi không chắc chắn nếu có một ngữ pháp. - Đối với phần thứ hai của nhận xét, tôi hiểu rằng logic đằng sau StackExchange là trả lời câu hỏi một cách độc lập, vì dòng câu trả lời không cố định, vì họ có thể thay đổi thứ tự hoặc được chỉnh sửa. Tôi sẽ xem xét điều đó. (Tôi đã xóa văn bản in đậm) Cảm ơn một lần nữa. : o)
Rafael

1
"nó chỉ mất khoảng 0,5% thông tin" [cần dẫn nguồn] :)
Warren Young

Xin chào Warren, đây là: otake.com.mx/Apuntes/PruebasDeCompresion2/. Nó là tiếng Tây Ban Nha, vui lòng sử dụng google dịch ngay bây giờ và tôi cần cập nhật nó. Trên thực tế, nó ít hơn 0,382% :)
Rafael

0

IrfanView hoạt động tốt đối với tôi đối với các bộ ảnh. Dưới đây là một số cách ghi chú

Dưới đây là quy trình được lưu trữ của tôi để chèn đường viền - Quy trình Infran để thêm đường viền

  1. Nhấp chuột phải vào hình ảnh, 'Mở bằng' -> 'InfranView'
  2. Nhấn 'b'
  3. Kiểm tra 'Sử dụng tùy chọn nâng cao' ở phía trên bên trái, nhấn 'Nâng cao'
  4. Kiểm tra 'Kích thước Canvas', nhấn 'Cài đặt'
  5. Nhập từng chiều rộng đường viền (Bên trái, Bên phải, Phía trên, Phía dưới)
  6. Nhấn OK'
  7. Chọn 'Ghi đè các tệp hiện có'
  8. Nhấn OK'
  9. Nhập thư mục đầu ra 'Thư mục đầu ra cho các tệp kết quả:'
  10. Điều hướng đến và nhấp đúp vào hình ảnh để thêm đường viền vào danh sách phía trên. Điều này thêm nó vào danh sách 'tệp đầu vào:' ở danh sách dưới cùng
  11. Nhấn 'Bắt ​​đầu hàng loạt'

1
Bạn có thể giải thích điều gì đặc biệt về các phương pháp đó để nó đáp ứng các yêu cầu của người đăng về việc không làm giảm chất lượng của hình ảnh không? Trong lần đọc đầu tiên, điều này dường như sẽ gửi JPEG qua toàn bộ chu trình giải nén-giải nén mà người đăng đang cố gắng tránh.
Philip Kendall

hmmm, bạn mang đến một điểm thú vị liên quan đến vòng đời hình ảnh thông qua quá trình tôi liệt kê ở đây, tôi không nghĩ về điều đó. Bạn có thể đúng, nếu bạn muốn tôi gỡ bỏ hoặc củng cố bài đăng của tôi thì xin vui lòng cho tôi biết :)!
J-Dizzle
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.