2011-05-11 25 views
12

Çok renkli tek renkli görüntü verileriyle çalışıyorum ve bu sabah libjpeg ve .Net jpeg codec'inin siyah beyaz veriyle işlenmesi arasında önemli bir fark olduğunu fark ettim. Libypeg kullanarak HERHANGİ bir kalite ayarında kaydedilen ve varsayılan .Net jpeg kodek kullanılarak açılan tek renkli bir görüntünün aslında yalnızca 16 farklı gri tonuyla yüklendiği ve tüm ara tonların kırpılmış olarak işlendiği görülmektedir. İşte libjpeg ve .Net jpeg codec bileşeni tek renkli verilerde önemli ölçüde farklı mıdır?

pürüzsüz gradyan

Histogram of codec conflict affected gradient

histogramı mükemmel düzeyde olması gerekirdi .net

tarafından libjpeg tarafından kaydedilen ve yüklenen bir histogramdır. Burada

Ve

(o mükemmel pürüzsüz bir geçiş olmalıdır) enter image description here

Bu gri 85 düz bir geçişin olması gerektiğini degrade neye benzediğini bir (büyütülmüş) örnek üzerinde 136 gri sola sağa ancak bu geçişi yapmak için sadece 4 gri tonu işlenmiştir.

Sorum şu ki, ben deliyim ve bu codec uyuşmazlığı ne kadar uzağa gider? Her iki kütüphaneyi farklı programlarda kullanıyorsanız iyi bir çözüm var mı?

Bir codec'i suçlamıyorum, sadece bir tutarsızlık gibi görünen şeyleri işaret ediyorum. Bunu libjpeg kullanarak oluşturduğum resimlerle fark ettim, bir kalite ayarı sorunu olduğunu varsaydım, test görüntülerini oluşturmak için faststone görüntü resizer'ı kullanarak denedim ve aynı sonucu aldım, irfanview kullanarak denedim ve aynı sonucu tekrar aldım. Bu programların her ikisi de bir jpeg kütüphanesi kullanması gerektiğinden, libjpeg kullanıyor olduklarını ve gerçek bir codec çakışması olduğunu varsaymayı tercih ediyorum.

Yükleme tarafında, hem kendi .net kodumla hem de Paint.net kullanarak, aynı sonuç yükleme görüntülerine rastladım.

Son olarak, burada normal çözünürlükte bir örnek var, böylece indirip kendiniz deneyebilirsiniz. Bazı programlara yüklediğinizde size güzel bir eğim (ör. Tarayıcınız) verilecek, ancak kendi .Net kodunuzla yüklenecek ya da Paint.Net size yukarıdaki gibi yalnızca 16 ton gri kullanılarak oluşturulan bir degrade eğimi verecektir.

enter image description here

kimse bu konuda daha fazla biliyor mu, gidiyor ve ne kadar iyi hangi geçici çözümler olabilir?

+1

Burada incelenmesi gereken bir kod yok ... –

+0

Bu bir JPEG ** gibi görünmüyor **. Dithering, JPEG eserlerini tetiklemesi gereken keskin kenarlara neden olur ve ben senin havaya uçurulmuş örnekte hiç göremiyorum. İrfanview ayarlarından şüpheleniyorum - libjpeg'i suçlamak tamamen erken. –

+1

P.S.işleminiz tarafından oluşturulan gerçek bir JPEG'i eklemek de çok yararlı olacaktır. –

cevap

4

Windows 7 ile birlikte gelen Paint sürümünde örnek resminizi açarak belirtilerinizi yeniden oluşturabilirim. Dosyayı incelemek geçerli bir JPEG olduğunu ve tarayıcıda düzgün bir şekilde görünmesini sağladığını doğrular. Microsoft'un gerçekten kötüye gittiği anlaşılıyor. Zaten bir hata olarak sunulmuştur:

https://connect.microsoft.com/VisualStudio/feedback/details/597657/grayscale-jpeg-image-read-as-format8bppindexed-but-quantized-as-format4bppindexed#details

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/9132e2bd-23cc-4e5a-a783-1fa4abe11624/

geçici çözüm tam renkli bir resim olarak JPEG oluşturmak, ama sadece içine gri tonlama piksel değerlerini koymak olacaktır.

+0

@johnmortal, lütfen oluşturulan resmin bir kopyasını gönderin Net ile. Nasıl karşılaştırdığını görmek gerçekten merak ediyorum. –

+0

Tamam, önceki yorumumu sildim çünkü yanlıştı. Jpegdump ile test ettiğim izlenim, sadece 1 bileşen jpeg’in hatalı yüklenmesidir. Paint.Net güzel bir şekilde bunu tersine çevirir çünkü tüm jpeg'ler 3 bileşenli jpeg olarak kaydedilir (çünkü bileşenlerin sayısı üzerinde açık bir kontrol sağlamaz). Bu, çok şişmanlığa neden olmaz çünkü jpeg, hemen hemen her zaman bir JFIF'e sarılır ve böylece JFIF bileşenlerinin YCbCr bileşenlerine sahip olması gerekir ve iki ekstra CbCr bileşeninin sıfır olması gerekir. –

+0

JpegBitmapEncoder kullanarak pixelformat.gray8 ile .Net kodu içinde piksel verisi başına 1 baytlık bir diziyi kaydetme, hatalı yüklenen 1 bileşenli bir jpeg oluşturur. –