Kaliteyi etkilemeden JPEG fotoğrafına nasıl kenarlık ekleyebilirim?


24

JPEG formatında 4680x3120 çözünürlükte bir fotoğrafım var. Bu fotoğrafın etrafına beyaz bir kenarlık ekleyerek 5200x3467 fotoğrafa dönüştürmek istiyorum (yazdırma nedeniyle).

Açıkçası, fotoğraftaki hiçbir şeyi değiştirmiyorum veya kaldırmıyorum, sadece bir şey ekliyorum. Bu nedenle, prensipte bu prosedür kayıpsız olabilir. Ancak, bu sınırı eklemek için Paint'i kullanacak olsaydım, Paint'in kaydetme işlemi fotoğrafı tekrar JPEG biçiminde sıkıştırarak bilgi ve kaliteyi kaybeder.

Fotoğrafın orijinal bölümünü etkilemeden, kalitesini düşürmeden kenarlık gibi JPEG fotoğrafa bir şeyler eklemenin bir yolu var mı (biraz daha profesyonel bir program)?

Yanıtlar:


35

Her ne kadar Philip'in cevabı gitmenin en iyi yolu olsa da, istediğinizi tamamen JPEG alanında yapmak mümkündür.

JPEG, görüntünüzü Minimum Kodlama Birimleri (MCU) adı verilen bloklara , genellikle her biri 16 × 16 boyutuna getirerek ve ayrı olarak sıkıştırarak çalışır. Sıkıştırma seviyesini çok yüksek krankladığınızda bunu görüntülerde görebilirsiniz. Daha makul sıkıştırma seviyelerinde, bloklar o kadar düzgün karışır ki sınırları asla göremezsiniz.

Bir görüntüye kayıpsız şekilde basit bir beyaz kenarlık eklemek için bu gerçeğin avantajlarından yararlanabiliriz. Basitçe, çıktı görüntü boyutuna eşit olan boş bir beyaz blok dizisi yaratmalıyız, sonra orijinal JPEG MCU bloklarını ortasına bırakalım.

Bu tekniğin bir dezavantajı vardır: yalnızca giriş ve çıkış görüntü boyutlarının her ikisi de MCU boyutunun bir katı olduğu zaman çalışır. Öyle olmadığında, beyaz kenarlık ile orijinal görüntünün kenarları arasındaki sınırdaki bazı blokları yeniden sıkıştırmamız gerekir. Aşırı yüksek JPEG sıkıştırma seviyelerinden uzak durursanız, çıktıda bu farkı görmezsiniz, bu yüzden etkin bir şekilde kayıpsız kalır .

Sadece bunu yapan hiçbir programın farkında değilim. Farkında olduğum en yakın şey ters işlemi yapan bir şeydir : jpegtran , görüntü kenarlarının parçalarını kayıpsız bir şekilde kesen bir kırpma işlevine sahiptir.² Bunu, görüntü kenarları boyunca kırpılmış MCU'ları atıp bırakarak orta el değmemiş.

Farkında olduğum en basit hazır çözüm , Photoshop için Better JPEG Lossless Resave eklentisidir. MCU'ları orijinal görüntüden kopyalamak için yukarıda verilen fikirlere dayanan teknikleri, Photoshop'un normal şekilde yaptığı gibi, sıkıştırılmamış sürümden yeniden oluşturmamak için mümkün olan her yerde kullanır.


Arasöz:

  1. JPEG'in kaybı çıktıda bir tür renk farkı yaratacağı için ortaya çıkan kenarlığın tamamen beyaz olmadığını düşünebilirsiniz. Bazı testler yaptım ve en azından Photoshop'ta, Save For Web'in JPEG seviyesi 10 (yani "düşük" kalite) aracılığıyla kaydedilen tamamen beyaz bir görüntü, tamamen beyaz olan kodu çözülmüş bir görüntüye neden oldu.

    Bunu iki testle belirledim:

    Önce, JPEG'i orijinalin üstüne bir katman olarak yükledim, üst katmanın karışım modunu Fark'a ayarladım, sonra farkları denemek ve büyütmek için üstüne bir Düzeyler ayar katmanı ekledim. Ortaya çıkan görüntü siyah kaldı ve "fark olmadığını" belirtti.

    İkinci olarak, beklenen farklılıkları göremediğimde, ayar katmanını düşürdüm ve JPEG katmanını Normal karışım moduna geri döndürdüm, damlalık aracını aldım ve RGB'nin göstermediği bir piksel için görüntünün her yerine baktım (255,255,255). ) Bilgi panelinde. Asla bir tane bulamadım. Resmin üzerine sürülürken rakamların biraz titreştiğini görmeyi umuyordum, ancak sabit kaldılar.

    Bunun sadece kodlama algoritmasının dejenere bir örneği olduğu sonucuna varabilirim: saf beyaz bloklar ayrık kosinüs dönüşümü boyunca beyaz kalır .

    İlginçtir, bu mu değil saf siyah bloklarla olur. En azından Photoshop uygulamasında, RGB (0,0,0) değil deşifre edildiğinde RGB'ye (1,1,1) dönüşürler.

    Alt satırda, yukarıdaki teknik kullanılarak üretilmiş bir görüntüyü yazdırırken bu kenarlıktaki sıçrama noktaları hakkında endişelenmenize gerek yok.

  2. jpegtranbir komut satırı programı, ancak aynı kodu temel alan bir GUI Windows programı da var jpegcrop.

  3. Ne yazık ki, bu eklenti yalnızca Windows.


1
Bu işlevi sağlayan JPEG Sihirbazı adlı bir program kullandım. Ayrıca JPEG'in farklı bölümlerine farklı sıkıştırma oranları uygulama konusunda çok hoş bir yeteneğe sahipti. Bir kişi, bir insanın kafası ve elleri için yüksek kaliteli bir ayar, elbiseleri için orta kalite ve arka plan için daha düşük kalite kullanabilir ve böylece daha küçük bir dosyayla sonuçlanabilir, ancak her şey için orta kalite kullanmış olandan daha iyi bir genel kalite elde edilebilir.
supercat

1
Bunu denemek için bir şans vermedi, ama bu blog yazısı düşündürmektedir jpegtranbireyin ekin fonksiyonu aslında da genişletmek için kullanılabilir. (Genişletilmiş sınırların hangi renge
dönüştüğünden

4
@ mattdm: Evet, jpegtranresmi de genişletebilir, ancak her zaman sabit kodlu bir orta gri RGB (128,128,128) ile doludur. Bunu basitçe yapar çünkü tek kolay seçenek çünkü DCT katsayısı boşluğunda basit bir bzero()çağrı ile bunu yapabilirsiniz . Bunu değiştirmek için çılgınca bir kesmeyi denedim , işe yaramadı, ama size çirkinlik duygusu vermeli. hayal kırıklığı içinde ellerini atar
Warren Young

@WarrenYoung: Dolgu bloklarının rengini değiştirmek için, muhtemelen sadece ilk (DC) katsayısını değiştirmeniz ve diğerlerini sıfırda bırakmanız gerekir. Tabii ki, katsayılar sıkıştırılmış, yani ... her neyse, yapılabilir olmalı, ama göründüğü kadar önemsiz olmadığına katılıyorum.
Ilmari Karonen

2
Son noktanıza gelince, en büyük tasarruf miktarı yüksek frekanslı bilgiyi atmaktan geliyor. Kesin bir piksel bloğunun rengindeki hassasiyetten kurtulma kazancı bir veya iki bayttan fazla olamaz, bu yüzden asla veya neredeyse hiç yapılmaz. Herhangi bir bilgi kaybı varsa, YUV <-> RGB renk aralığı dönüşümündedir.
hobbs

20

Burada hatırlanması gereken nokta , fotoğrafı kayıplı bir sıkıştırma biçiminde kaydederken kalitenizi kaybetmenizdir . Fotoğrafı , kenarlığı ekledikten sonra kayıpsız bir biçimde (PSD, TIFF vb.) Kaydettiğiniz sürece , fotoğrafı ilk etapta JPEG olarak kaydederek kaybettiğinizden daha fazla veri kaybetmezsiniz.


1
Teşekkürler. Bu, Paint gibi bir 'crappy' programı kullanırken, örneğin TIFF'e kaydederken de geçerlidir.
LBogaardt

4
En azından hızlı testime göre, Paint, TIFF'leri kaydederken kayıpsız LZW sıkıştırma algoritmasını kullanıyor, böylece Tamam görünüyor.
Philip Kendall

5
Bunun görüntünün boyutunu önemli ölçüde artırması muhtemel olduğunu unutmayın ...
BlueRaja - Danny Pflughoeft

2
boya aynı zamanda kayıpsız bir format olan PNG'yi de destekliyor
phuclv

Jpeg'ye kaydetmeyi tartışan cevaplar olarak buradaki +1, tüm jpeg kodlama seçenekleriyle uyumlu değildir.
James Snell

6

Bu oldukça kayıpsız değildir , ancak GIMP'yi (veya benzer bir özelliğe sahip başka bir editörü) ve aşağıdaki iki püf noktasını kullanarak oldukça yaklaşabilirsiniz :

  1. Öncelikle, eklediğiniz kenarlığın 8 piksel genişliğinde bir kat (ve tercihen 16 piksel) olduğundan emin olun .

    Bu önemlidir, çünkü JPEG sıkıştırma algoritması , görüntüyü sol üst köşeden başlayarak 8 × 8 piksel bloklara * böler ve kayıplı sıkıştırma algoritmasını bağımsız olarak her bir bloğa uygular. Böylece, en azından prensipte, mevcut olanların çevresine tam 8 x 8 piksel bloklar ekleyerek bir JPEG görüntüsünü kayıpsız şekilde doldurabilirsiniz. Bununla birlikte, çok sayıda blok genişliğinde olmayan bir kenarlık eklemeye çalıştıysanız, dolgulu görüntüdeki bloklar orijinaldeki satırlarla aynı olmaz ve bazı sıkıştırma kayıpları kaçınılmaz olur.

    *) Aslında, JPEG görüntülerin çoğu kroma alt örneklemesini kullanır ; bu, görüntünün yalnızca gri tonlamalı bölümünün gerçekte 8 × 8 blokta sıkıştırıldığı anlamına gelir; oysa chroma kanalları sıkıştırma öncesinde% 50 oranında küçültülür ve efektif blok boyutu 16 × 16 piksel. Bu nedenle, en iyi sonucu elde etmek için kenarlık genişliğiniz gerçekten 16 pikselden fazla olmalıdır. Ancak, genellikle 8 (veya 24 veya 40 vb.) Piksel kenarlıktan kurtulursunuz, çünkü kromadaki bir miktar sıkıştırma kaybı çok belirgin değildir.

  2. Püf noktasının ikinci kısmı, son görüntüyü kaydederken, Görüntüyü JPEG Olarak Dışa Aktar iletişim kutusundaki " Gelişmiş görüntülerin altındaki " Orijinal görüntüden kalite ayarlarını kullan " onay kutusunu işaretlemektir . Bunu, normalde kullandığınızdan daha düşük bir kaliteye yol açacak gibi görünse bile yapın!

    Bu ayar, orijinal görüntünün, kullanılmıştır tam olarak aynı sıkıştırma ayarlarına yeniden GIMP yapar genellikle sıkıştırma kayıplarının etrafında% 99 ortadan kaldırır, şartıyla , siz de ağır görüntüyü Düzenlemediğiniz ve özellikle şu şekilde bloklar Yeni görüntü hala orijinal olanlarla aynı hizada (Zaman zaman yuvarlama hataları nedeniyle hala bazı kayıplar olacaktır, ancak aksi durumda olacağından çok daha az.)


Hızlı bir örnek olarak, bu JPEG test görüntüsünü , başlangıçta 50 olan oldukça düşük bir kalite ayarıyla kaydedilen Wikimedia Commons'tan aldım ve yukarıda açıklanan yöntemi kullanarak süslü (8px siyah-beyaz) bir kenarlık ekledim:

8px kenarlıklı test görüntüsü, çoğunlukla kayıpsız

Orijinal (15.1 kB) ve düzenlenen resim (16.7 kB) arasındaki fark, GIMP'nin "Tahıl ekstresi" katman modu kullanılarak gösterilmiştir:

Dolgulu görüntü ile orijinal arasındaki fark

Sınır genişliğinin 16'nın katı olmamasından kaynaklanan bazı çok küçük kroma hataları görebilirsiniz ve (yakından bakarsanız) luma kanalında yuvarlama nedeniyle küçük kayıpların olduğu birkaç blok da görebilirsiniz. Yine de, görsel olarak, orijinal ve dolgulu görüntü, 2x büyütmede bile fark edilemez ve aralarında dönüşümlü olarak kayıyor.

Özellikle, JPEG kalitesi çarpma sonucunda bu kontrast kadar aşağıdaki 17.6 kB görüntü oluşturur yastıklı görüntü kaydetmeden önce 50 ila 60 den:

8 piksel sınırında test görüntüsü, 50'den 60'a yükseltilmiş kalite

Yüksek büyütmede, düzenlenen görüntünün, orijinalinkinden bazı yerlerde fark edilir derecede bulanık olduğunu görebilir ve Tahıl özü ile farkı almak şunları doğrular:

Dolgulu görüntü (q60'ta) ve orijinal arasındaki fark


"bu onay kutusunun seçilmesi" Aşamalı "ayarını etkilemiyor gibi görünüyor. Aşamalı kodlama, kalite ayarı değil, kodlama ayarı olduğundan hata değil. Jpegtran kayıpsız şekilde aşamalı olarak aşamalı olarak görüntüleri dönüştürebilir.
Damian Yerrick 17:15

tepples: Haklısın; Bu paragrafı kaldırdım. Bazı nedenlerden dolayı, ilerici modun değiştirilmesinin kalite ayarlarının eşleşmemesine neden olacağı izlenimindeydim, ancak hızlı bir test bunun hakkında yanıldığımı onaylıyor gibi görünüyor.
Ilmari Karonen

1
@thomasrutter: Yorumdan vazgeçemiyorum, bu yüzden yalnızca özelliği açıklayan orijinal forum gönderisine , özellikle de şu alıntıya işaret edeceğim : " Görüntüde yalnızca birkaç değişiklik yaptıysanız, aynı nicemleme tabloları kullanarak orijinal resim size hemen hemen aynı kalitede ve dosya boyutu verecektir Bu, farklı nicemleme tabloları kullanılan ne olacağını kıyasla niceleme adımı kaynaklanan kayıpları en aza indirecektir.. "
Ilmari Karonen

1
Sadece karşılaştırma için, işte farklı bir soruya cevap olarak başka bir örnek . Teoride anlayışım Ilmari ile aynı fikirde ama en azından benim örneğimde uygulama Thomas'ın söylediği ile çok daha fazla gözüküyor - en azından yüksek oranda bozulmuş bir görüntüyle başlarken. (Bence mezar taşı bu amaç için kötü bir örnek yapar, çünkü
taştaki

1
@ mattdm: Oldukça yazılıma bağımlı görünüyor; Sonuçlarınızı GIMP'deki bu cevaptan elde etmeye çalıştım ve görünüşe göre GIMP (en azından v2.8.10, en azından) JPEG kalitesini korumakta ImageMagick’ten (test ettiğiniz sürüm) daha iyi. Q75'te bir kez kaydedilen ilk görüntünüzde 34.0298 PSNR değeri varken, q75'te iki kez kaydedilen bir tane yalnızca 32.8169'dan (ve 8 kez yeniden kaydedilenin 32.6459 PSNR'sine sahip) biri. Buna karşılık, aynı kaynak görüntünün bir kez Q75'de GIMP'ye kaydedilmesi 36.4560 PSNR değerini verir; aynı kalitede açılması ve tekrar açılması sadece hafifçe 36.3295'e düşer.
Ilmari Karonen

3

Tam olarak istediğin bu değilse üzgünüm ama ...

Görüntüyü yazdırırken konumlandırmak için beyaz bir kenarlık eklemeye benziyorsunuz. Neden baskı arayüzlerini düzgün bir şekilde öğrenmeye odaklanıp, bu kadar tehlikeli bilgisayar korsanlarından kaçının? Bu ortaya çıkan diğer konu, yazdırma programınızın 4680x3120 görüntünüzü doğru DPI / çözünürlüğe uyacak şekilde yeniden boyutlandırmasına izin vermenizdir. Bunun bir jpeg'i yeniden kaydetmekten daha ciddi bir etkisi olabilir.


Her iki geçerli nokta, teşekkür ederim. Ancak, fotoğrafımı çevrimiçi baskı mağazalarından birine yükledim, bu nedenle gerçek yazıcı üzerinde kontrol sahibi değilim.
LBogaardt

1

Önceki cevaplar çok iyi.

Jpg formatının bazı “psikolojik yönlerini” ekleyeceğim.

Bir jpg iyi hazırlanmışsa, sadece yaklaşık% 0.5 bilgisini kaybeder. Bu, vakaların çoğunda, insan gözünün göremediği bir şey. Bazı analizler yapmak ve farklılıkları görmek için bir programa ihtiyacınız var (Ilmari'nin yaptığı analiz gibi).

"İyi Kalite", yalnızca bir dosya biçiminin görüntüyü kaydetme biçimi değil, bir süreçtir. Evet, gerçekten ihtiyacın olduğu için dosyayı bir kez daha jpg ile sıkıştırdın . Kontrollü bir durumda ise, bunu yapmak tamam.

Sen gerçekten bu size çok özel depolama veya yazılım ihtiyaçlarını ya çok sıkı bir iş akışına sahip, başka kayıpsız biçimini kullanan olamayacağını ima gerekli.

Kaliteden gerçekten endişe duyuyorsanız, muhtemelen Paint'i kullanmazsınız. JPG formatı, Paint'te kontrol edemediğiniz bazı yapılandırmalara sahiptir.

İşte jpg sıkıştırmasını ve seçmeniz gereken seçeneği gerçekten kontrol edebileceğiniz ücretsiz programlar listem. (Hepsi jpg kaydetme iletişim kutusundaki)

Irfanview - Açık Renk renk alt örneğini devre dışı bırak.

FastStone Image Viewer - Renkli örnekleme: Yok.

Gimp - Örnekleme 4: 4: 4

Sonuç. Paint'i kullanmayın.

Henüz kontrol etmediğim bir şey. Tüm bu programlar gömülü renk profilini koruyorsa. Gönderimi daha sonra düzenlerim.


Birisi bu cevaba -1 oy verdi. Normalde umrumda değil çünkü aptalca bir şey söyleyebilirim biliyorum. Bu özel durumda, Cevabın hangi kısmı yanlış?
Rafael

Ben oy (yukarı veya aşağı) yoktu, ama sen belki daha iyi bir ilk izlenim vermek için yazım ve dilbilgisi üzerinde çalışmaya istiyorum (ve ayrıca, dürüst, okumak Cevabınız kolaylaştırmak için). Ayrıca, bu sorunun zaten birkaç cevabı var (ve özellikle benimki oldukça uzun çıktı); Bir noktada, bazı insanlar var olanlara açıkça yeni bir şey eklemeyen cevapları aşağıya oylamaya (ya da en azından yukarı fırlatmayarak) başlayabilir . Ayrıca, cevabınızı, önemli bitlerin bir bakışta göze çarpacak şekilde yapılandırmaya çalışın; Bu durumda, koyu olarak vurguladığınız tek kısım önemsiz bir dipnottur.
Ilmari Karonen

Yorumunuz için teşekkür ederiz Ilmari. Anadilim olmadığı için ingilizce düşünmeye çalışıyorum. Bir yazım aracı arayacağım. Dilbilgisi olup olmadığından emin değilim. - Yorumun ikinci kısmı için, StackExchange'in arkasındaki mantığın soruyu bağımsız olarak cevaplamak olduğu, çünkü cevapların akışının sabit olmadığı, çünkü sırasını değiştirebilecekleri veya düzenlenebilecekleri anlaşılıyor. Buna bir göz atacağım. (Kalın metni kaldırdım) Tekrar teşekkürler. : o)
Rafael

1
"sadece% 0.5 bilgisini kaybeder" [kaynak belirtilmeli] :)
Warren Young

Hey Warren, işte burada: otake.com.mx/Apuntes/PruebasDeCompresion2/… İspanyolca, lütfen şimdilik google çeviri kullan ve güncellemem gerekiyor. Aslında% 0.392'den azdır :)
Rafael

0

IrfanView , görüntüler için benim için iyi çalışıyor. İşte bazı nasıl yapılır notları

Sınır ekleme için saklı yordamım - Sınır ekleme yordamını Infran

  1. Sağ Tıklama resmi, 'Birlikte Aç' -> 'InfranView'
  2. 'B' ye basın
  3. Sol üst kısımdaki 'Gelişmiş seçenekleri kullan' seçeneğini işaretleyin, 'Gelişmiş'e basın
  4. 'Tuval Boyutu' seçeneğini işaretleyin, 'Ayarlar'a basın
  5. Her kenarlık genişliğini girin (Sol taraf, Sağ taraf, Üst taraf, Alt taraf)
  6. Tamam tuşuna basın'
  7. 'Mevcut dosyaların üzerine yaz' seçimini yapın
  8. Tamam tuşuna basın'
  9. Çıktı dizinine 'Sonuç dosyaları için çıktı dizini:'
  10. Üst listeye kenarlık eklemek için görüntüye gidin ve çift tıklayın. Bu alt listedeki 'giriş dosyaları:' listesine ekler
  11. 'Toplu İş Başlat' düğmesine basın

1
Posterin görüntünün kalitesini düşürmeme gerekliliklerini karşılaması için bu yöntemle ilgili özel olanı açıklayabilir misiniz? İlk okumada, JPEG'in posterin kaçınmaya çalıştığı tüm açma-yeniden sıkıştırma döngüsü boyunca gönderdiği görülüyor.
Philip Kendall

hmmm, burada listelediğim süreç boyunca görüntü yaşam döngüsü ile ilgili ilginç bir noktaya getiriyorsunuz, bunun için düşünmedim. Haklı olabilirsiniz, ilanımı kaldırmam veya değiştirmemi istiyorsanız lütfen bana bildirin :)!
J-Dizzle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.