Bu yazımızda c# ile resimlerimizi belirlediğimiz bir boyuta küçülteceğiz ve üzerine yazı(watermark) ekleyeceğiz. Genellikle bu işlem ASP.NET ile yapılan web sayfalarında çok fazla kullanılıyor. Ayrıca küçültme işlemi yapılırken de resmin görünümünün en az şekilde etkilenmesini sağlamak temel amacımız olacak. Tabi bu işlem kod boyutunu biraz arttıracaktır.
Peki resim boyutunu küçültmek bize ne sağlar. Diyelim ki yemek tariflerinin yer alacağı herkesin üye olup tarif ekleyebileceği ve tariflerinin fotoğraflarını çekip siteye yükleyebileceği bir site hazırlamak istiyoruz. Tabi ki herkesin eklediği resmin çözünürlüğü birbirinden farklı olacak. İşte sorun bu noktada ortaya çıkıyor. Olsun canım ne olacak derseniz.
- Farklı çözünürlükte ki resimler sayfada görünüm hatalarına neden olabilir,
- Resimlerin çözünürlüğü çok yüksek olduğundan sayfanın yüklenme hızını düşebilir,
- Yüksek çözünürlüklü resimler sunucu üzerinde fazla yer kaplarlar ve bant genişliğini gereksiz harcayabilirler,
- Ayrıca resmin küçük bir önizlemesinede (thumbnail) ihtiyaç duyulabilir.
Aklıma bunlar geldi şimdilik ama proje geliştirirken bundan daha farklı sorunlarla karşılaşabilirsiniz. Resim boyutunu küçülttükten sonrada üzerine watermark adı verilen birde yazı ekleyeceğiz. İsterseniz siz bu bölümü koddan kolaylıkla kaldırabilirsiniz. Eğer kodları web sitenizde kullanacaksanız, resimlerinizin üzerinde sitenizin isminin yazılması, resimlerinizin kopyalanıp farklı yerlerde kullanılmasını engelleyecektir.
Evet şimdi projemize geçelim. Projemizi bir class(sınıf ) olacak şekilde hazırlayalım ki ilerde farklı projelerde kullanabilelim.
Öncelikle projemize bir sınıf ekleyerek başlıyoruz. Ben sınıfıma Resimislemleri adını verdim.
Bu kısımda kodları ekliyorum kodun nasıl çalıştığıyla ilgili bilgileri kod aralarındaki açıklama satırlarında bulabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI.WebControls; //Fileupload nesnesini kullanabilemk için yukardaki isimuzayını ekleyin. public class Resimislemleri { //Fonksiyonumuzu static olarak tanımladık. //Parametrelere dikkat edelim 3 adet parametre almış.Fonksiyonumuza gelen 1.parametre resmi seçtiğimiz //Fileupload nesnesinin kendisi.2.parametre resmin genişliği piksel cinsinden yüksekliği genişliğe göre kendi //ayarlıcak.3.parametre resmi hangi isimle kayıt etmek istediğimiz. Bu size kalmış resmin orjinal ismi yada //benzersiz bir guid olabilir. public static void resimYukle(FileUpload fupload, int resimBoyutu, string resimIsmi) { if (fupload.HasFile) { System.Drawing.Image yuklenenFoto = null; HttpPostedFile yuklenenResim= fupload.PostedFile; yuklenenFoto = System.Drawing.Image.FromStream(yuklenenResim.InputStream); //Image nesnesi tanımladık ve Fileuploaddaki resmi image nesnesine atadık. KucukBoyut(yuklenenFoto, resimBoyutu, resimIsmi); //Şimdi resmimizi küçük boyut fonksiyonuna gönderip boyutlandıracağız. } } protected static void KucukBoyut(System.Drawing.Image yuklenenFoto, int resimBoyutu, string resimIsmi) { System.Drawing.Bitmap islenmisFoto = null; System.Drawing.Graphics grafikNesnesi = null; int hedeflenenGenislik = resimBoyutu; int hedeflenenYukseklik = resimBoyutu; int yeni_gen, yeni_yuk; yeni_yuk = (int)Math.Round(((float)yuklenenFoto.Height * (float)resimBoyutu) / (float)yuklenenFoto.Width); yeni_gen = hedeflenenGenislik; hedeflenenYukseklik = yeni_yuk; yeni_gen = yeni_gen > hedeflenenGenislik ? hedeflenenGenislik : yeni_gen; yeni_yuk = yeni_yuk > hedeflenenYukseklik ? hedeflenenYukseklik : yeni_yuk; islenmisFoto = new System.Drawing.Bitmap(hedeflenenGenislik, hedeflenenYukseklik); grafikNesnesi = System.Drawing.Graphics.FromImage(islenmisFoto); grafikNesnesi.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.White), new System.Drawing.Rectangle(0, 0, hedeflenenGenislik, hedeflenenYukseklik)); int x = (hedeflenenGenislik - yeni_gen) / 2; int y = (hedeflenenYukseklik - yeni_yuk) / 2; grafikNesnesi.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; grafikNesnesi.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; grafikNesnesi.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); grafikNesnesi.DrawImage(yuklenenFoto, x, y, yeni_gen, yeni_yuk); //Buraya kadar ki işlemler resmin boyutunu enaz kayıpla küçültme işlemlerini yaptı.Kodları inceleyiniz. //Satır satır açıklamak bazen anlamsız olabiliyor. System.Drawing.Font yazi = new System.Drawing.Font("Century Schoolbook", 12, System.Drawing.FontStyle.Italic); System.Drawing.Brush br = new System.Drawing.SolidBrush(System.Drawing.Color.WhiteSmoke); System.Drawing.Point nokta1 = new System.Drawing.Point(hedeflenenGenislik / 3, hedeflenenYukseklik - 30); grafikNesnesi.DrawString("kodlamamerkezi.com", yazi, br, nokta1); //Bu kısımdaki kodlarla resmin üzerine Beyaz bir şekilde kodlamamerkezi.com yazdırdık. islenmisFoto.Save(HttpContext.Current.Server.MapPath("~/Resimler/" + resimIsmi + ".jpg"), codec, eParams); //Son olarak resmimizi resimler klasörüne kaydettik. } } |
Kodlarımız bu kadar projenizin istediğiniz bir yerinde sınıfı çağırıp kullanabilirsiniz. Kodlarla ilgili sorunlarınızı alt kısıma yorum olarak yazarsanız cevaplayabilirim.
Gerçekten çok işimize yaradı teşekkür ederim süper anlatım gereksiz kod vb hiç birşeyle karşılaşmıyoruz
Gerçekten çok işimize yaradı teşekkür ederim çok faydalı oluyor