ASP.NET’te C# Kullanarak Resmi Boyutlandırma ve Üzerine Çapraz Watermark Yazdırma
7
Yorum
2291

kez okundu..

Merhabalar.
Bu yazımızda fileupload ile yüklenen bir resmin üzerine çapraz olarak nasıl “watermark” yazabileceğimizi anlatmaya çalışacağız.
Buradaki çalışma mantığını şu şekilde özetleyebiliriz.  Öncelikle resmi boyutlandırıyoruz. Resmin oranını bozulmaması için de genişlik ve yükseklik oranına göre uygun şekilde boyutlandırma yapılmaktadır. Resim boyutlandırdıktan sonra resmin köşegen uzunluğu alınıyor. Bu köşegen uzunluğunu watermark yazısının boyutunu belirlemek için kullanacağız. Köşegen ne kadar uzunsa yazı da o kadar büyük olacak gibi düşünebiliriz. Daha sonra da resmin köşegen eğimini hesaplayarak o eğime uygun şekilde watermarkımızı yazarak kaydediyoruz.
Şimdi öncelikle bu işi yapan sınıf ve metodumuzu hazırlayalım. App_code klasörümüze Resim.cs isminde bir dosya oluşturuyoruz. Kodlarımız ise şöyle
 
using System;
using System.Web;
using System.Drawing;
 
public class Resim
{
    public void Kaydet(HttpPostedFile Dosya, int genislik, int yukseklik, string yol, string watermark)
    {
        Bitmap resim = new Bitmap(Dosya.InputStream);
        //resmin boyutu bizim vermiş olduğumuz genişlik veya yükseklikten büyükse boyutlandırma yapıyoruz.
        if (resim.Width > genislik || resim.Height > yukseklik)
        {
            Size ebatlar = new Size(resim.Width, resim.Height);
            //resmin genişlik ve yükseklik oranını alıyoruz.
            double oran = ((double)resim.Width / (double)resim.Height);
            if (resim.Width > genislik && genislik > 0)
            {//burada genişlik parametresi 0 olarak verilmişse boyutlandırma yapılmayacak. Yani resim orijinal genişliğinde kalacak.
                ebatlar.Width = genislik;
                ebatlar.Height = (int)((double)genislik / oran);
            }
            if (ebatlar.Height > yukseklik && yukseklik > 0)
            {//burada yükseklik parametresi 0 olarak verilmişse boyutlandırma yapılmayacak. Yani resim orijinal yükseklikte kalacak.
                ebatlar.Height = yukseklik;
                ebatlar.Width = (int)((double)yukseklik * oran);
            }
            resim = new Bitmap(resim, ebatlar);
        }
 
        //resmin üzerine yazı yazmak istemeyebiliriz o yüzden “watermark” parametresine boş string verebiliriz.
        if (!string.IsNullOrEmpty(watermark))
        {
            Graphics graf = Graphics.FromImage(resim);
            //resmin şeffaflık (alpha) değeri ve renk değerleri belirleniyor.
            SolidBrush firca = new SolidBrush(Color.FromArgb(45, 0, 0, 0));
 
            //resmin köşegen uzunluğu pisagor denklemiyle hesaplanıyor.
            double kosegen = Math.Sqrt(resim.Width * resim.Width + resim.Height * resim.Height);
            Rectangle kutu = new Rectangle();
 
            //bu 3 satırda ise yazının başlama noktası (x,y koordinatları) ve ayrıca font boyutu ayarlanıyor.
            //bunun için aşağıdaki gibi yaklaşık değerler kullandım 1,3..... 1,6.... gibi siz bu rakamlarla oynama yapabilirsiniz.
            kutu.X = (int)(kosegen / 10);
            float yazi = (float)(kosegen / watermark.Length * 1.3);
            kutu.Y = -(int)(yazi / 1.6);
 
            Font fnt = new Font("times new roman", yazi, FontStyle.Bold);//font tipi ve boyutu       
            //can alıcı noktamız burası
            //burada köşegen eğimini aşağıdaki formülle hesaplıyoruz.
            float egim = (float)(Math.Atan2(resim.Height, resim.Width) * 180 / System.Math.PI);
                     graf.RotateTransform(egim);

            StringFormat sf = new StringFormat();

            // ve nihayet watermarkımızı resim üzerine yazdırıyoruz.
            graf.DrawString(watermark, fnt, firca, kutu, sf);
        }
 
        //dosyanın türüne göre de kayıt işlemini yaptırıyoruz.
        if (Dosya.ContentType == "image/jpeg" || Dosya.ContentType == "image/pjpeg")
            resim.Save(yol, System.Drawing.Imaging.ImageFormat.Jpeg);
        else if (Dosya.ContentType == "image/gif")
            resim.Save(yol, System.Drawing.Imaging.ImageFormat.Gif);
        else if (Dosya.ContentType == "image/png" || Dosya.ContentType == "image/x-png")
            resim.Save(yol, System.Drawing.Imaging.ImageFormat.Png);
        resim.Dispose();
    }
}
 
 
 
Şimdi bir aspx sayfası oluşturup içerisine bir buton ve bir fileupload koyalım. Butonun click olayına şu kodu yazmamız yeterli olacak.
Resim resim = new Resim()
resim.Kaydet(FU1.PostedFile, 800, 600, Server.MapPath("~/resimler/" + FU1.FileName), "www.destekyeri.com");
 
-Şekildeki Sonuç
 
İşte bu kadar. Başka bir anlatımda görüşmek dileğiyle. Herkese iyi çalışmalar.
 

 

05.11.2010 tarihinde yazıldı..
Özkan ATMACA

İsminiz
Puanınız
Yorumunuz
Kalan karatkter sayısı : 500
Yorumumu Gönder
 
Akif AKINCI
Harika olmuş.Görsel imaja ihtiyaç duymadan anlaşılır bir makale. Text yerine aynı zamanda bir logo imajınında watermark uygulaması olarak kullanmak mümkün olabilir. Bunuda ek olarak bilinmesi isterim. WaterMark görselinizi yaptığınız uygulamada dinamik olarak yönetici panellerinde kullanıcılarınıza sunabilirsiniz.
kerem
çok makbule geçti eksik olmayın kolay gelsin iyi çalışmalar : )
Sadık Önal
resmin kalitesi düşüyor. yüksek kalitede nasıl yükleyebiliriz.
Özkan ATMACA
Resminizin boyutu çok büyükse 3-5 mb gibi ve bu dosyayı küçük boyutla kaydediyorsanız resim bozulabilir. Ayrıca kaydetme ebatları da önemli. Bu örnekte 800*600 kullanıldı. Siz daha büyük ölçülerde kayıt yapabilirsiniz. Bunların dışında Grahics sınıfından da faydalanabilirsiniz. Graphics sınıfıınn InterpolationMode özelliğini InterpolationMode.HighQualityBicubic olarak ayarlarsanız kalite biraz daha iyileşebilir. Graphics sınıfına ait diğer özellikleri de incelemeniz faydalı olabilir.
Sadık Önal
Graphics sınıfıınn InterpolationMode özelliğini sizin kodun neresine ilave edebiliriz?
Sadık Önal
sizin kodların içerisinde hangi noktada kullanacağız.
Özkan ATMACA
Merhaba. Doğrusu ben bu graphics sınıfı üzerinden ebatlandrıma denemedim. ne kadar iyi sonuç verir bilemiyorum. ama şurada örnek bir kullanım ver isterseniz inceleyin. http://www.webcosmoforums.com/asp/321-create-high-quality-thumbnail-resize-image-dynamically-asp-net-c-code.html

 Anasayfa | Haberler | Duyurular | Ziyaretçi Defteri | Yazarlık Başvurusu | Logolar | Linkler | GB-TEAM 

 

Destekyeri.com, Embedded By GB-TEAM 2006 |  Tüm Hakları Saklıdır . Yayınlanan yazıların izin alınmadan kopyalanması ve kullanılması  5846 sayılı Fikir ve Sanat Eserleri Yasasına göre suçtur.

GelecekBurada.com