Asp.Net ile fotoğrafları kaliteli boyutlandırma

Fotoğrafları direk boyutlandırdığımız zaman ciddi bir kalite kaybı meydana geliyor. CompositingQuality, InterpolationMode veya SmoothingMode değerleriyle oynasakda Photoshop’ un boyutlandırma kalitesine erişemiyoruz. Biraz araştırma yaptıktan sonra EncoderParameters ve ImageCodecInfo ile kalitenin ciddi bir şekilde arttırıldığını gördüm. Sonuç aşağıdaki görselde açık bir şekilde görülebiliyor. Özellikle üzerinde yazı bulunan görsellerde fark daha iyi farkediliyor. Aşağıda ki kodu kullanmak için fileupload nesnenizi methoda göndermeniz yeterli. Örneğin; fotograf.yukle(FileUpload1); Şunu da eklemek lazım, kaliteli ve kalitesiz fotoların aralarında neredeyse yarı yarıya boyut farkı bulunuyor.

public class fotograf
{
    public static void yukle(FileUpload fu)
    {
        System.Drawing.Image orjinalFoto = null;
        HttpPostedFile jpeg_image_upload = fu.PostedFile;
        orjinalFoto = System.Drawing.Image.FromStream(jpeg_image_upload.InputStream);
        boyutlandir(orjinalFoto, 50, fu.FileName);
    }

    protected static void boyutlandir(System.Drawing.Image orjinalFoto, int boyut, string dosyaAdi)
    {
        System.Drawing.Bitmap islenmisFotograf = null;
        System.Drawing.Graphics grafik = null;

        int hedefGenislik = boyut;
        int hedefYukseklik = boyut;
        int new_width, new_height;

        new_height = (int)Math.Round(((float)orjinalFoto.Height * (float)boyut) / (float)orjinalFoto.Width);
        new_width = hedefGenislik;
        hedefYukseklik = new_height;
        new_width = new_width > hedefGenislik ? hedefGenislik : new_width;
        new_height = new_height > hedefYukseklik ? hedefYukseklik : new_height;

        islenmisFotograf = new System.Drawing.Bitmap(hedefGenislik, hedefYukseklik);
        grafik = System.Drawing.Graphics.FromImage(islenmisFotograf);
        grafik.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.White), new System.Drawing.Rectangle(0, 0, hedefGenislik, hedefYukseklik));
        int paste_x = (hedefGenislik - new_width) / 2;
        int paste_y = (hedefYukseklik - new_height) / 2;

        grafik.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        grafik.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        grafik.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

        System.Drawing.Imaging.ImageCodecInfo codec = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()[1];
        System.Drawing.Imaging.EncoderParameters eParams = new System.Drawing.Imaging.EncoderParameters(1);
        eParams.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 95L);

        grafik.DrawImage(orjinalFoto, paste_x, paste_y, new_width, new_height);
        islenmisFotograf.Save(HttpContext.Current.Server.MapPath("~/" + dosyaAdi), codec, eParams);
    }
}

Kodu bir kaç yerden derleyerek yazdım. Bundan dolayı iyi bir kod değil :) Bu arada yeri gelmişken, ilerleyen günlerde kapsamlı bir görsel upload sınıfını sizlerle paylaşacağım.

  • http://hasangursoy.com.tr/ HasanG

    Kaliteli resimlerde sol ve üst köşelerinde bir bozukluk var yanlız :)

    • apoStyLEE

      Doğru bir tespit, çok dikkatlisiniz :) Durumun sebebine müsait olduğum bir zamanda bakıp buradan paylaşacağım ;)

  • http://www.renkhane.com yirmiuc

    s.a abi,
    HasanG arkadasin dedigi soruna bakabildin mi acaba ? ben biraz arastirdim da bulamadim ?

  • http://renkhane.com yirmiuc

    bu satırı
    grafik.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
    bu şekilde düzenleyince problem ortadan kalkıyor.
    grafik.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default;

    http://photocontroller.imagecomponent.net/v1/src/artical/whyinterpolationmode.html

  • http://hasangursoy.com.tr/ HasanG

    Yirmiuc’un verdiği bağlantıda sorunun çözümü verilmiş:
    PixelOffsetMode
    CompositingQuality

    özelliklerine yüksek değer verilmesini öğütlüyor en altta.

    Assign some high quality values to these two properties, you can get a perfect resized image afterwards.

  • http://renkhane.com yirmiuc

    evet şuanda uyguladım ve çok güzel sonuç aldım.

    PS ile aynı ölçülerde küçültüp kalite farkını görmek istedim sonuç ikiside aynı oldu.

  • http://Websitesi Crypty

    yirmiuc ve apostylee çok teşekkürler. avatar boyutlandırma için kalite kaybını kara kara düşünürken çok fazla yardımınız oldu :)