2009-07-27 11 views
6

ASP.NET MVC'den dönen JPEG görüntüleri desteklemeye çalışıyorum (90 derecelik artışlarla). Ben System.Drawing (GDI +) kullanmaya çalışıyorum, ancak sorunları yaşıyorum..NET'te JPEG'leri minimum kalite kaybıyla döndürme

Görüntüyü döndürebilen ancak kalite kaybına neden olan Image.RotateFlip kullanmayı denedim. Enkoder kalitesi 100 olsa bile, döndürülen görüntüde orijinal görüntüde olmayan ve diğer programları (Gimp vb.) Kullanarak döndürdüğümde görünmeyen nesneler görünür.

using (Image image = Image.FromFile("C:\\source.jpg")) { 
    ImageFormat sourceFormat = image.RawFormat; 
    image.RotateFlip(RotateFlipType.Rotate90FlipNone); 
    EncoderParameters encoderParams = null; 
    try { 
     if (sourceFormat == ImageFormat.Jpeg) { 
      encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L); 
     } 
     image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams); 
    } finally { 
     if (encoderParams != null) 
      encoderParams.Dispose(); 
    } 
} 

transforming a JPEG without loss of information ile ilgili bir makale buldum. Encoder.Transformation .NET gelen bir seçenek olarak görünmektedir kullanma - ancak bunun boyutları bilen var mı 16.

using (Image image = Image.FromFile("C:\\source.jpg")) { 
    ImageFormat sourceFormat = image.RawFormat; 
    EncoderParameters encoderParams = null; 
    try { 
     if (sourceFormat == ImageFormat.Jpeg) { 
      encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(Encoder.Transformation, 
       (long)EncoderValue.TransformRotate90); 
     } 
     image.Save("C:\\target.jpg", GetEncoder(sourceFormat), encoderParams); 
    } finally { 
     if (encoderParams != null) 
      encoderParams.Dispose(); 
    } 
} 

katları olsun veya olmasın, hiç döndürmek için benim JPEG testi görüntülerin herhangi neden alamıyorum NET'te bir JPEG'i 90 derece artışlarla, yukarıdaki yöntemlerden veya başka bir yöntemden herhangi birini kullanarak minimum düzeyde veya hiç kalite kaybı olmadan nasıl başarılı bir şekilde döndürülebilir? Teşekkürler.

Ayrıca burada GetEncoder benim uygulama görebilirsiniz:

private ImageCodecInfo GetEncoder(ImageFormat format) { 
    foreach (var info in ImageCodecInfo.GetImageEncoders()) 
     if (info.FormatID == format.Guid) 
      return info; 
    return null; 
} 

Düzenleme: daha iyi benim gerçek kod eşleşecek şekilde yukarıdaki kodu güncellenmiş

. hata aşağıdaki satırda oldu: O olmalıydı

if (sourceFormat == ImageFormat.Jpeg) { 

: my yayınlanan kod çalıştı teyit için

if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) { 
+2

Kodunuz benim için çalışıyor .. Verileriniz için bir ImageCodecInfo döndüğünden emin misiniz? –

+0

Teşekkürler @pb, bir ImageCodecInfo alıyorum ama bir encoderParams alıyorum çünkü benim gerçek kod bir hata vardı ayarlamadan önce ek bir kontrol vardı. –

cevap

1

teşekkürler. Bu benim problemimi çözmeme yardımcı oldu. Şimdi aptalım. Benim gerçek kod encoderParams ayarlamadan önce görüntü formatı için bir çek vardı - ama bir hata vardı:

if (sourceFormat == ImageFormat.Jpeg) { 
    // set encoderParams here 

yukarıdaki koşullu encoderParams getirilmedim bu yüzden her zaman false keşfetti. düzeltme basitti:

if (sourceFormat.Guid == ImageFormat.Jpeg.Guid) { 
2

, görüntüyü açar döndüren ve onu sıkıştırır herhangi bir yöntemle ile, kalite kaybı alacak.

JPEG formatı, dört pikselin tümünü temsil edecek şekilde ortalama bir renk elde ederek 2x2 piksel kareler halinde renk bilgilerini sıkıştırır; böylece, resim genişliğiniz ve boyunuz ikiye bölündüğü takdirde, daha az kaliteyi kaybedersiniz. sıkıştırma, dekompresyonda enterpolasyon yapılan bilgidir.

Benzer şekilde, parlaklık bilgileri 8x8 piksel kareler halinde sıkıştırılır; böylece, genişliğiniz ve yüksekliğiniz sekiz ile bölünebilirse, görüntüyü döndürdükten sonra kılavuz hizalanır ve daha az gerçek bilgi kaybedersiniz.

Kayıpsız bir dönüş yapmak için, JPEG dosyasını okuyarak ve her bir kareyi yeniden düzenleyerek ve yeniden sıkıştırmadan döndürülen görüntüyü oluşturacak şekilde yeniden düzenleyerek tamamen farklı bir yöntem kullanmanız gerekir.