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

14
Şubat
2013
ASP.NET’te C# Kullanarak Resmi Boyutlandırma ve Üzerine Çapraz Watermark Yazdırma
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.
 

 

MAKALE-YORUMLAR

İsminiz
Yorumunuz


Doğrulama kodu

?

MAKALEYE YORUM YAZ

İsminiz
E-posta adresiniz
Yorumunuz
Doğrulama kodu ?

Copyright © 2006 - 2013  DESTEKYERI.COM

Embedded by  ® SANALOG 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. Makalelerin "alıntı" olduğunu belirterek yayınlayabilir ve kaynağı belirtmeniz önemlidir !!!