Osman KURT

Yazılım Uzmanı | MVC Eğitmeni

ASP.Net'de Kaliteli Resim Küçültme ve Boyutlandırma, Ölçeklendirme

İnternet dünyasının hızlı şekilde büyümesi ve günlük hayatımızın vazgeçilmez öğesi olması ile birlikte hayatımızın bütün media datalarını internet ağı üzerinde bulundurur olduk. Firmalar da kendi sayfalarında yada ürünlerini pazarladıkları e-ticaret sayfalarında oldukça sık şekilde media dosyaları paylaşmakta. Doğru olanı da budur zaten ama doğruyu biz yazılımcıların yapması gerekmekte. Mesela 100 ürün resminin olduğu bir sayfayı düşünelim tanesi 1 MB olan 100 adet resim dosyası ve orjinal boyutlarda koyulmuş düşünsenize sadece ürün listelemek için 100 MB :D kotamızın 4 GB olduğunu düşünürsen 40 kere aynı siteye girmek yeter :D Şimdi yazılımcı olarak alacağımız önlemlerin başında resim ölçeklendirme gelir. Nasıl mı? İşte alt kısımda ki kodla yapıyoruz. Önce class dosyamız var onu bir oluşturalım isterseniz.

public class fotograf
{
    public static void yukle(FileUpload fu, int Ksize)
    {
        System.Drawing.Image orjinalFoto = null;
        HttpPostedFile jpeg_image_upload = fu.PostedFile;
        orjinalFoto = System.Drawing.Image.FromStream(jpeg_image_upload.InputStream);
        KucukBoyut(orjinalFoto, Ksize, fu.FileName);       
    }
    protected static void KucukBoyut(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.Default;

        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("/klasor/" + dosyaAdi), codec, eParams);
    }
}

Şimdi ise Default.aspx sayfamıza 1 adet fileupload ve 1 adet buton koyalım daha sonra da butonumuza çift tıklayalım. Gelen click event'mize alt kısımda ki kodumuzu yazalım ve işlemimizi tamamlayalım.

protected void Button1_Click(object sender, EventArgs e)
    {
            fotograf.yukle(FileUpload1, 150);
     }

 İşlemimiz bu kadar arkadaşlar. Artık kaliteli bir şekilde resimlerimizi boyutlandırabiliriz.

Görüşmek üzere,

Osman KURT

Yazılım Uzmanı

Yorumlar (15) -

  • serkan

    06.12.2012 07:07:30 | Yanıtla

      string resimadi = "";
            string uzanti = "";

            if (FileUpload1.HasFile)
            {
                uzanti = Path.GetExtension(FileUpload1.PostedFile.FileName);
                resimadi = Ayarlar.UrlSeo(slideadi.Value) + "_SlideIMG_" + DateTime.Now.Millisecond + DateTime.Now.Minute + DateTime.Now.Second + uzanti;
                FileUpload1.SaveAs(Server.MapPath("../Fileupload/sahte" + uzanti));

                int Donusturme = 400;

                Bitmap bmp = new Bitmap(Server.MapPath("../Fileupload/sahte" + uzanti));
                using (Bitmap OrjinalResim = bmp)
                {
                    Bitmap yeniresim = new Bitmap(FileUpload1.PostedFile.InputStream);
                    yeniresim = new Bitmap(yeniresim);
                    yeniresim.Save(Server.MapPath("../Fileupload/Slide/" + resimadi), ImageFormat.Jpeg);


                }

                FileInfo fiSahte = new FileInfo(Server.MapPath("../Fileupload/sahte" + uzanti));
                fiSahte.Delete();
            }

            SqlConnection baglanti = system.baglan();
            SqlCommand cmdKaydet = new SqlCommand("insert into Slide (SlideResim)Values(@SlideResim)", baglanti);
            cmdKaydet.Parameters.Add("SlideResim", resimadi);
            cmdKaydet.ExecuteNonQuery();
            Response.Write(alarmVer.msjBox("Ekleme İşlemi Tamamlanmıştır.", "Slide.aspx"));

    bu tarz bir ekleme işlemi yaptırıyorum. ama resimlerin kalitesi çok düşüyor. yukarıda ki örneği bu yapıya nasıl ekleyebilirim ?

    • osmankurt

      06.12.2012 15:02:51 | Yanıtla

      Merhaba Serkan,
      Yapı çok basit benim kodlarımı bir adet class oluştur içine kopyala. Daha sonra projen de resim eklerken benim oluşturduğum classı kullan yani;
      FileUpload1.SaveAs(Server.MapPath("../Fileupload/sahte" + uzanti));  yerine
      fotograf.yukle(FileUpload1, 150); kısmını kullanacaksın. Sql e kayıt yaparken de FileUpload1.FileName olarak kayıt yapacaksın. Dikkat edersen ben boyutu da değişken olarak verdim. Classı incelersen basit olduğunu anlarsın bence
      Kolay gelsin...

  • Yücel

    26.12.2012 07:35:41 | Yanıtla

      islenmisFotograf.Save(HttpContext.Current.Server.MapPath(path + dosyaAdi), codec, eParams);
    bu kısımla ilgili hata alıyorum.

    Aşağıdaki kodları kullanınca upload işlemi yapılıyor fakat bu seferde resim boyutlandırılmış haliyle yüklenmiyor ftp ye orjinal halini yüklüyor. Bu sorunu nasıl düzeltebilirim.

                 string ftpUserName = ConfigurationManager.AppSettings["FtpUserName"].ToString();
                string ftpUserPassword = ConfigurationManager.AppSettings["FtpUserPassword"].ToString();


                string path = ConfigurationManager.AppSettings["WebSiteMapPath"].ToString();
                WebClient wc = new WebClient();

                wc.Credentials = new NetworkCredential(ftpUserName, ftpUserPassword);
                wc.UploadData(string.Concat(path, islenmisFotograf), temp);

    • osmankurt

      26.12.2012 09:27:18 | Yanıtla

      Merhaba,
      Nasıl bir hata aldığınızı görmem lazım. Çünkü ben yaptığım proje de kullanıyorum bu kodu ve herhangi bir sıkıntı olmuyor. İsterseniz hata kısmını da gönderin onun üzerinden gidelim.

  • Bülent

    13.08.2013 02:07:22 | Yanıtla

    boyutları elle otomatik olarak nasıl ayarlayabilirim örnek olarak 900X300 nasıl ayarlayabilirim

    • osmankurt

      13.08.2013 09:03:34 | Yanıtla

      fotograf.yukle(FileUpload1, 150);
      Kısımın da 150 yerine  parametre göndereceksin tabi iç kısımda otomatik olarak ayarlanan diğer rakamı parametreden alır hale getirmen gerekmekte.

      • Serkan

        13.08.2013 09:16:32 | Yanıtla

        Bununla ilgili bir örnek yapma şansınız var mı ?

        • Bahtiyar

          07.10.2014 21:10:37 | Yanıtla

          Merhaba, dostum sen bir örnek yapabildin mi?

  • yagup

    18.09.2013 16:30:01 | Yanıtla

    Güzel paylaşım için teşekkürler...

  • Hüseyin ÖZKAN

    01.11.2014 13:04:53 | Yanıtla

    böyle paylaşımlar olmasa iş gerçekten zor. sabah baya uğraşmıştım. Faydalandım Allah (C.C.) razi olsun.

  • erdem

    22.03.2016 21:09:32 | Yanıtla

    Merhabalar,

    Transparan kaydedemiyorum. Arka plan beyaz çıkıyor.

  • Kamil

    05.05.2016 13:45:58 | Yanıtla

    Merhaba resmin height değerinin 80px width değerininde buna göre orantılı küçülmesini istiyorum acaba nasıl yapabilirim? yapmak istediğim şey slide show resmin bir orjinal halini bide thumbs klasörü oluşturup içine otomatik küçültülmüş halini koymak istiyorum

  • mustafa

    28.11.2016 00:57:34 | Yanıtla

    Osman Hocam
    Bu sistemin aynısını asp.net mvc içerisinde nasıl kullanabiliriz?
    Bu konuda bir makale yazarsanız çok faydalı olur.

  • ahmet

    20.03.2017 16:53:34 | Yanıtla

    ben yapamadım.Class taki FileUpload hata verdi.  değişken olarak tanımlamam gerek herhalde.
    Keşke indir diye dosyayı da koysaydınız.
    Benim gibi yeni başlayanlarda öğrenirdi. Yinede teşekkürler

  • evrim ergül

    16.04.2017 17:10:56 | Yanıtla

    merhaba ben kodunuzu kullanıyorum elinize sağlık çok işime yaradı fakat şöyle bir problem var png resim attığımda arkası boş olan resmin boş kısımlarını beyaz olarak yükleme gerçekleştiriyor.bunun bir çözümü varmı?

Loading