C# ile Resim İşleme Fonksiyonları

C# ile Resim İşleme Fonksiyonları Nelerdir?

 

C# ile birçok 3. parti pluginler ile resim boyutlandırma işlemleri yapılabiliyor. Peki herhangi bir plugin kullanmadan nasıl boyutlandırma yapılır? Bu işlemler biraz karmaşık gelebilir, bu yüzden de iş katmanında oluşturacağımız bir sınıf tüm işimizi görebilir. Şimdi bu sınıfı ve nasıl kullanacağımıza bakalım. 

Oluşturacağımız sınıf içerisinde resim yeniden boyutlandırma, resim belirli bir genişliğe göre yeniden boyutlandırma, resim kırpma, resime watermark ekleme, resim şeffaflığını ayarlama ve resim kaydetme gibi metodlarımız mevcut olacaktır.

C# ile Resim Boyutlandırma Nasıl Yapılır?

public Bitmap ResizeImage(Image image, int width, int height)
        {
            if (image.Width <= width)
            {
                width = image.Width;

            }
            if (image.Height <= height)
            {
                height = image.Height;
            }
            Bitmap bmpt = new Bitmap(width, height);
            Graphics grt = Graphics.FromImage(bmpt);
            grt.CompositingQuality = CompositingQuality.Default;
            grt.SmoothingMode = SmoothingMode.Default;
            grt.InterpolationMode = InterpolationMode.Bicubic;
            grt.PixelOffsetMode = PixelOffsetMode.Default;
            grt.DrawImage(image, 0, 0, width, height);
            return bmpt;
        }

 

public Bitmap ResizeImageFixedWidth(Image image, int width)
        {
            int srcWidth = image.Width;
            int srcHeight = image.Height;
            int thumbWidth = 0;
            int thumbHeight = 0;
            if (srcHeight > srcWidth)
            {
                double horan = (srcWidth * 100) / srcHeight;
                thumbHeight = width;
                thumbWidth = Convert.ToInt32((thumbHeight * horan) / 100);
            }
            else if (srcWidth > srcHeight)
            {
                double woran = (srcHeight * 100) / srcWidth;
                thumbWidth = width;
                thumbHeight = Convert.ToInt32((thumbWidth * woran) / 100);
            }
            else if (srcHeight == srcWidth)
            {
                thumbHeight = width;
                thumbWidth = width;
            }

            Bitmap bmp = new Bitmap(thumbWidth, thumbHeight);
            bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
            Graphics gr = Graphics.FromImage(bmp);

            gr.CompositingQuality = CompositingQuality.Default;
            gr.SmoothingMode = SmoothingMode.Default;
            gr.InterpolationMode = InterpolationMode.Bicubic;
            gr.PixelOffsetMode = PixelOffsetMode.Default;

            Rectangle imageRectangle = new Rectangle(0, 0, thumbWidth, thumbHeight);
            Rectangle rectDestination = new Rectangle(0, 0, thumbWidth, thumbHeight);
            gr.DrawImage(image, imageRectangle, rectDestination, GraphicsUnit.Pixel);

            gr.Dispose();
            return bmp;
        }

 

Oluşturacağımız ResizeImage metodu ile yüklenmiş olan bir resmi ya da yüklenecek olan bir resmi boyutlandırabilirsiniz. Biz şimdi yüklenecek olan bir resim üzerinden örnek vereceğiz.

 

Bitmap resizedImage = ResizeImage(Image.FromStream(Request.Files[0].InputStream), 1024, 800);

 

Bu şekilde boyutlandırdığımız bir resim kötü sonuçlar doğurabilir. Bunun sebebi de resime ait boyut ve çözünürlükdür. Eğer resim 600x1000 (yani dikey resim) boyutlarına sahip ise doğru bir boyut ortaya çıkmayacaktır. Peki doğru bir sonuç için nasıl bir işlem yapılması gerekir. Bunun için sabit genişlik vereceğimiz ve yüksekliğini kendisinin ayarlayacağı bir metod kullanmak daha doğru olacaktır. Bu metod ise şu şekildedir.

 

Bitmap resizedImage = ResizeImageFixedWidth(Image.FromStream(Request.Files[0].InputStream), 1024);

 

Resmi bu şekilde 1024 sabit genişliğinde boyutlandırdığımızda 600x1000 boyutlarındaki resimde bile sorun çıkmayacaktır. 

C# ile Resim Kırpma Nasıl Yapılır?

 

public Bitmap CropImage(Image image, int x, int y, int width, int height)
        {
            Rectangle rectDestination = new Rectangle(x, y, width, height);
            Bitmap bmp = new Bitmap(rectDestination.Width, rectDestination.Height);
            Graphics gr = Graphics.FromImage(bmp);
            gr.CompositingQuality = CompositingQuality.Default;
            gr.SmoothingMode = SmoothingMode.Default;
            gr.InterpolationMode = InterpolationMode.Bicubic;
            gr.PixelOffsetMode = PixelOffsetMode.Default;
            gr.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), rectDestination, GraphicsUnit.Pixel);
            return bmp;
        }

 

Yukarıda gördüğünüz metod ile C#'da resmi kırparak istediğiniz boyutlara getirebilirsiniz. Resim kırpma işlemlerinde boyutlandırmada olduğu gibi resim boyutlarına ve çözünürlüğüne dikkat edilmelidir. Resim kırpmaya örnek verecek olursak;

 

var croppedImage = CropImage(Image.FromStream(Request.Files[0].InputStream), x, y, 500, 500);

 

CropImage metodunda x ve y koordinatlarına bakacak olursak bunların anlamı şu şekildedir:

x: Resmin yatay olarak x koordinatındaki yerini ifade eder.

y: Resmin dikey olarak y koordinatındaki yerini ifade eder.

x = 0; y = 0; olduğunda resmin sol en üst kısmından başlayarak kesme işlemini yapacaktır.

C# ile Resime Watermark Nasıl Eklenir?

 

public static Bitmap WatermarkImage(Bitmap image, Bitmap watermark)
        {
            using (Graphics imageGraphics = Graphics.FromImage(image))
            {
                watermark.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);
                int x = (image.Width - watermark.Width) / 2;
                int y = (image.Height - watermark.Height) / 2;

                Image _watermark = SetImageOpacity(watermark, .5f);
                imageGraphics.DrawImage(_watermark, x, y, _watermark.Width, _watermark.Height);
            }
            return image;
        }

 

public static Image SetImageOpacity(Image image, float opacity)
        {
            try
            {
                //create a Bitmap the size of the image provided  
                Bitmap bmp = new Bitmap(image.Width, image.Height);

                //create a graphics object from the image  
                using (Graphics gfx = Graphics.FromImage(bmp))
                {
                    //create a color matrix object  
                    ColorMatrix matrix = new ColorMatrix
                    {

                        //set the opacity  
                        Matrix33 = opacity
                    };

                    //create image attributes  
                    ImageAttributes attributes = new ImageAttributes();

                    //set the color(opacity) of the image  
                    attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

                    //now draw the image  
                    gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);

                }
                return bmp;
            }
            catch (Exception)
            {
                return null;
            }
        }

 

C# ile watermark yapmak için yukarıdaki WatermarkImage metodunu kullanabilirsiniz. Bu metodun ilk parametresi watermark eklenecek resimi, ikinci parametre ise watermark resmini ifade eder. Watermark işlemine örnek için aşağıdaki kodları kullanabilirsiniz;

 

Bitmap watermarkImage = new Bitmap(Image.FromFile(Server.MapPath("~/assets/AlfaLogo.png")));
Bitmap watermarkedImage = WatermarkImage(ResizeImageFixedWidth(Image.FromStream(Request.Files[0].InputStream), 1200), watermarkImage);

 

 Genel olarak C# ile resim boyutlandırma, kırpma ve watermark ekleme işlemleri bu şekildedir. 3. parti pluginler ile bu işlemleri daha kolay yapabilirsiniz. Bu pluginler arasında en fazla kullanılanlar şu şekildedir;

Daha fazla plugin için Nuget paket yükleme aracını kullanabilirsiniz.

Örnekler için kullandığımız sınıfı şu şekilde oluşturabilirsiniz.

 

public class ImageProcess
    {

        public Bitmap ResizeImage(Image image, int width, int height)
        {
            if (image.Width <= width)
            {
                width = image.Width;

            }
            if (image.Height <= height)
            {
                height = image.Height;
            }
            Bitmap bmpt = new Bitmap(width, height);
            Graphics grt = Graphics.FromImage(bmpt);
            grt.CompositingQuality = CompositingQuality.Default;
            grt.SmoothingMode = SmoothingMode.Default;
            grt.InterpolationMode = InterpolationMode.Bicubic;
            grt.PixelOffsetMode = PixelOffsetMode.Default;
            grt.DrawImage(image, 0, 0, width, height);
            return bmpt;
        }

        public Bitmap ResizeImageFixedWidth(Image image, int width)
        {
            int srcWidth = image.Width;
            int srcHeight = image.Height;
            int thumbWidth = 0;
            int thumbHeight = 0;
            if (srcHeight > srcWidth)
            {
                double horan = (srcWidth * 100) / srcHeight;
                thumbHeight = width;
                thumbWidth = Convert.ToInt32((thumbHeight * horan) / 100);
            }
            else if (srcWidth > srcHeight)
            {
                double woran = (srcHeight * 100) / srcWidth;
                thumbWidth = width;
                thumbHeight = Convert.ToInt32((thumbWidth * woran) / 100);
            }
            else if (srcHeight == srcWidth)
            {
                thumbHeight = width;
                thumbWidth = width;
            }

            Bitmap bmp = new Bitmap(thumbWidth, thumbHeight);
            bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);
            Graphics gr = Graphics.FromImage(bmp);

            gr.CompositingQuality = CompositingQuality.Default;
            gr.SmoothingMode = SmoothingMode.Default;
            gr.InterpolationMode = InterpolationMode.Bicubic;
            gr.PixelOffsetMode = PixelOffsetMode.Default;

            Rectangle imageRectangle = new Rectangle(0, 0, thumbWidth, thumbHeight);
            Rectangle rectDestination = new Rectangle(0, 0, thumbWidth, thumbHeight);
            gr.DrawImage(image, imageRectangle, rectDestination, GraphicsUnit.Pixel);

            gr.Dispose();
            return bmp;
        }

        public void CropImageAndSave(Image image, string url, int x, int y, int width, int height)
        {
            Rectangle rectDestination = new Rectangle(x, y, width, height);
            Bitmap bmp = new Bitmap(rectDestination.Width, rectDestination.Height);
            Graphics gr = Graphics.FromImage(bmp);
            gr.CompositingQuality = CompositingQuality.Default;
            gr.SmoothingMode = SmoothingMode.Default;
            gr.InterpolationMode = InterpolationMode.Bicubic;
            gr.PixelOffsetMode = PixelOffsetMode.Default;
            gr.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), rectDestination, GraphicsUnit.Pixel);
            bmp.Save(HttpContext.Current.Server.MapPath(url), image.RawFormat);
            bmp.Dispose();
            image.Dispose();
        }

        public Bitmap CropImage(Image image, int x, int y, int width, int height)
        {
            Rectangle rectDestination = new Rectangle(x, y, width, height);
            Bitmap bmp = new Bitmap(rectDestination.Width, rectDestination.Height);
            Graphics gr = Graphics.FromImage(bmp);
            gr.CompositingQuality = CompositingQuality.Default;
            gr.SmoothingMode = SmoothingMode.Default;
            gr.InterpolationMode = InterpolationMode.Bicubic;
            gr.PixelOffsetMode = PixelOffsetMode.Default;
            gr.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), rectDestination, GraphicsUnit.Pixel);
            return bmp;
        }

        public static Bitmap WatermarkImage(Bitmap image, Bitmap watermark)
        {
            using (Graphics imageGraphics = Graphics.FromImage(image))
            {
                watermark.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);
                int x = (image.Width - watermark.Width) / 2;
                int y = (image.Height - watermark.Height) / 2;

                Image _watermark = SetImageOpacity(watermark, .5f);
                imageGraphics.DrawImage(_watermark, x, y, _watermark.Width, _watermark.Height);
            }

            return image;
        }

        public static Image SetImageOpacity(Image image, float opacity)
        {
            try
            {
                //create a Bitmap the size of the image provided  
                Bitmap bmp = new Bitmap(image.Width, image.Height);

                //create a graphics object from the image  
                using (Graphics gfx = Graphics.FromImage(bmp))
                {
                    //create a color matrix object  
                    ColorMatrix matrix = new ColorMatrix
                    {

                        //set the opacity  
                        Matrix33 = opacity
                    };

                    //create image attributes  
                    ImageAttributes attributes = new ImageAttributes();

                    //set the color(opacity) of the image  
                    attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

                    //now draw the image  
                    gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);

                }
                return bmp;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public static ImageCodecInfo GetEncoder(ImageFormat format)
        {

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }

        public static void SaveJpeg(string path, Image image)
        {
            ImageCodecInfo encoder = GetEncoder(ImageFormat.Jpeg);
            if (encoder != null)
            {
                EncoderParameters encoderParameters = new EncoderParameters(1);
                encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 50L);
                image.Save(path, encoder, encoderParameters);
            }
            else
            {
                image.Save(path);
            }
        }

    }

 

Bu yazımızında sonuna gelirken herkese hayırlı işler dileriz. Sağlıcakla kalın. 

Görüşme yapmak ister misiniz?

İşletmenizin en kritik sorunları ve fırsatları konusunda yardımcı oluyoruz. Birlikte kalıcı değişim ve sonuçlar almaya ne dersiniz?