Linklerim
İstatistikler
Ziyaretçi Sayısı:7794
Sayfa Görüntüleme Sayısı:35885
Makale Sayısı:24
Yorum Sayısı:58

Kullanıcıların Web uygulamalarında sunucuya yüksek çözünürlükte resim upload etmesi bazen sıkıntı yaratabiliryor. Yada kullanıcıdan sabit bir boyutta resim istediğinizde bu işlemi kullanıcıya bırakmak işininiz zora sokuyor olabilir. Bu sorunun çözümü için sunucuya upload edilen resmi istediğiniz boyutta kaydedip saklayabilmek için bir class oluşturalım. Böylece hem bu işlemi kullanıcıya bırkmamış olur ve hemde yüksek çözünürlükteki resimleri sayfamızda gösterirken kaybettiğimiz zamanı kazanmış oluruz.
 
Örneğin kullanıcının upload ettiği resmi hem anasayfanızda thumbnail (küçük resim) maximum 80x80 boyutunda hemde üzerine tıklandığında  maximum 800x800 boyutunda göstermek istiyorsunuz. Bu işlem için aynı resmin 2 kopyasını sunucumuzda tutarak sayfa yükleme hızını arttırabilirsiniz.
Thumbnail için 80x80
Büyük Resim için 800x800 gibi
 
İşte bu işlemi yapmak için aşağıdaki classı kullanabilirsiniz. ResimOlustur methoduna resmin adresini ve istediğiniz maximin en yada boy değerini vererek resmi oluşturabilirsiniz.
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
 
namespace ResimIslem
{
    public class ResimIslem
    {
        ///<summary>
        /// Fiziksel adresi gonderilen resmi oranını değiştirmeden yeniden boyutlandırır.
        ///</summary>
        ///<param name="MaxBoy">Yükseklik yada Genişlik için istediğiniz maximum pixel değeri</param>
        ///<param name="orjResim">Orjinal resmin fiziksel adresi</param>
        ///<returns></returns>
        public Image ResimOlustur(int MaxBoy, string orjResim)
        {
          
            int boy, yuk;
            Image resim = Image.FromFile(orjResim);
            Size boyut = resim.Size;
            if (MaxBoy >= boyut.Height && MaxBoy >= boyut.Width)
                return null;
            double oran = (double)boyut.Width / boyut.Height;
            if (boyut.Width >= boyut.Height)
            {
                boy = MaxBoy;
                yuk = (int)(boy / oran);
            }
            else
            {
                yuk = MaxBoy;
                boy = (int)(yuk * oran);
            }
 
            Image th = new Bitmap(boy, yuk, resim.PixelFormat);
            Graphics g = Graphics.FromImage(th);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Rectangle dikdortgen = new Rectangle(0, 0, boy, yuk);
            g.DrawImage(resim, dikdortgen);         
            resim.Dispose();
            return th;
 
        }
    }
}
 
Test etmek için yeni bir ASP.NET Web Site uygulaması başlatalım. Eğer Class Library olarak oluşturduysanız class’ı Add Referance diyerek .dll dosyanızı projenize ekleyin daha sonra using satırını ekleyin. Eğer oluşturmadıysanız projenize yeni bir class ekleyin ve yukarıdaki kodu yazın.
 
Projenizin içerisen galeriler isminde yeni bir klasor oluşturun ve bu klasor içerisine orj,kresim ve resim isminde 3 tane daha klasor oluştur.
 
Resmi ilk upload ettiğimizde orjinal halini orj klasorune kaydedeceğiz daha sonra küçük boyutunu kresim ve istediğimiz büyük boyutta olanı iste resim klasorune kaydedeceğiz.

 
Daha sonra uygulamanıza FileUpload,Button ve Label yerleştirin.
Gönder button’un click event’inde kodumuzu yazalım.
if (FileUpload1.HasFile)
        {
            ResimIslem yap = new ResimIslem();
            string yol = Server.MapPath("~/galeriler/orj/" + FileUpload1.FileName);
            string uzanti = FileUpload1.FileName.Substring(FileUpload1.FileName.LastIndexOf('.') + 1).ToLower();
            if (File.Exists(Server.MapPath("~/galeriler/resim/") + FileUpload1.FileName))
            {
                lblhata.Text = "Bu isimde Resim Zaten Var!";
                return;
            }
            lblhata.Text = "";
            if (uzanti == "bmp" || uzanti == "jpeg" || uzanti == "jpg" || uzanti == "gif")
            {
 
                if (FileUpload1.FileBytes.Length < 3145728)
                {
                    FileUpload1.SaveAs(yol);
 
                    System.Drawing.Image kucuk, buyuk;
                    kucuk = yap.ResimOlustur(100, yol);
                    buyuk = yap.ResimOlustur(500, yol);
                    kucuk.Save(Server.MapPath("~/galeriler/kresim/" + FileUpload1.FileName));
                    buyuk.Save(Server.MapPath("~/galeriler/resim/" + FileUpload1.FileName));
                    File.Delete(yol);
                }
                else
                {
                    lblhata.Text = "Yüklemek istediğiniz resim çok büyük";
                }
 
            }
            else
            {
                lblhata.Text = "Lütfen Resim bmp,jpeg,jpg yada gif uzantılı dosya seçin!";
 
            }
 
        }
        else
            lblhata.Text = "Lütfen Resim Seçin";
 
Uygulamanızı çalıştırın ve yüksek çözünürlükte 500x500 den büyük bir resim upload edin. İşlem bittikten sonra kresim klasorunda eni yada boyu max 100 olan bir resim, resim klasorunda ise eni yada boyu max 500 olan resim göreceksiniz. Ve orj klasorunun içinin boş olduğunu göreceksiniz. Böylece gereksiz yüksek çözünürlük sıkıntısından kurtulmuş olduk.

  Sinan UÇAR - 3/31/2010 11:26:38 PM
dosya adından kesilen uzatının küçük harfe dönüştürülmesini sağlıyor. if bloğında da küçük harfe göre kontrol ediliyor.
  hasan - 3/31/2010 3:09:50 PM
FileName.ToLower() bu kodun vazifesi nedir neden eklediniz bunu açıklayabilirmisiniz bi zahmet. yeniyim mantığını anlamaya çalışıyorum. Bu kod varsa ne olur olmaz sa ne olur?tşkler.
  mkc - 2/1/2010 3:55:30 AM
allah razı olsun dostum içten söylüyorum
  TasarımTR - 1/22/2010 6:56:12 PM
Hocam öncelikle teşekkürler. Yazmış olduğunuz kodlarda gereksiz kısımlar yada daha farklı yöntemle yapılabilecek kısımlar mevcut; Emeğinize sağlık... Saygılarımla
  Sinan UÇAR - 1/13/2010 4:11:39 PM
işine yaradığına sevindim. Umarım seninde tüm isteklerin gerçekleşir.
  İlker Tatar - 12/18/2009 4:59:05 AM
Sinan kardeş: İnan beni nasıl bir sorundan kurtardığını bilemessin, makalen çok işime yaradı.. Canı gönülden söylüyorum İnşallah tüm istediklerin gerçekleşir.
  Metin - 12/9/2009 12:53:35 AM
Teşekkürler, Çok hoş bir çalışma, kodlarınızdan epey faydalandım.
  Sinan UÇAR - 11/5/2009 5:52:52 PM
3mb'nin byte karşılığı. 3 * 1024 * 1024 = 3145728
  vestan - 10/23/2009 2:01:40 AM
anlamadığım bişey var. boyutu kontrol ederken 3145728 sayısını kullanmışsınız? Rastgele bir sayı mı? Neye karşılık geliyor?
  vestan - 10/21/2009 3:53:26 PM
Mükemmel anlatım. Allah razı olsn
  Sinan UÇAR - 9/4/2009 2:42:01 AM
Resimlerin veritabanında image olarak tutulmasından çok resimlerin adresinin yada sadece adlarının tutmanız daha mantıklı olabilir.
  Baha - 8/25/2009 11:29:56 AM
Kardeş bunu database kaydetme ve databaseden çekme olayınada girseydin çok iyi olurdu . Yani benim o konuda çok ciddi bir açığım var bana yardımcı olursanız çok sevinirim.
  mehmet - 8/5/2009 5:12:00 PM
yalnız, Dim uzanti As String = Path.GetExtension(FileUpload1.FileName).ToLower() daha uygun olur
  mehmet - 8/5/2009 4:09:38 PM
emeğine sağlık kardeşim.
  mehmet - 8/5/2009 4:09:25 PM
emeğine sağlık kardeşim. biraz uğraştım ama VB'ye çevirdim ve uygulama sorunsuz çalışıyor. daha önce ecnebi sitelerinden bir iki kodla uğraştım ama seninkiler kadar temiz çalışmamıştı. şimdi tek yapmam gereken, bunları db'ye kaydetmek:) kolay gelsin.
  Selim - 5/23/2009 5:34:15 PM
Kodları vs2008 de çalıştıramadım çalışan halini mailime atabilirseniz sevinirim.
  zulkuf - 3/8/2009 5:34:20 PM
buyuk.Save(Server.MapPath("~/galeriler/resim/" + FileUpload1.FileName)); bu satırı asagıdakı satırla degıstırmek faydalı olabılır. buyuk.Save(Server.MapPath("~/galeriler/resim/" + FileUpload1.FileName), ImageFormat.Jpeg);
  Sinan Uçar - 2/7/2009 12:49:17 PM
Yazdığınız kodu email adresime gönderirseniz inceleyip size yardımcı olmaya çalışırım. snn@sinanucar.com
  Bir dost :D - 2/6/2009 3:16:16 AM
Merhaba Sinan Bey! Einize sağlık güzel bir makale olmuş. Ben getThumbnailImage kullanarak boyutlandırıyorum fakat bir sıkıntı var. Benim küçlttüğüm resim veritabanına on kat büyük kb'tta gidiyor bunun bir çözümü yok mu?
  Ramazan - 11/30/2008 3:52:30 PM
Hocam ellerine sağlık çok hoş bir makale

Kimden:  

Yorumunuz:
 
Yorumunuz 255 karakterden fazla olamaz!