128 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.Drawing.Imaging;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar
 | 
						|
{
 | 
						|
    internal static class ImageHelper
 | 
						|
    {
 | 
						|
        public static void DrawImageCenteredDpiAware(Graphics g, Image image, Rectangle r)
 | 
						|
        {
 | 
						|
            if (g.DpiX != 96f || g.DpiY != 96f)
 | 
						|
            {
 | 
						|
                float scaleX = g.DpiX / 96f;
 | 
						|
                float scaleY = g.DpiY / 96f;
 | 
						|
                g.DrawImage(image, r.X + (r.Width - image.Width * scaleX) / 2, r.Y + (r.Height - image.Height * scaleY) / 2,
 | 
						|
                    image.Width * scaleX, image.Height * scaleY);
 | 
						|
            }
 | 
						|
            else
 | 
						|
                g.DrawImage(image, r.X + (r.Width - image.Width) / 2, r.Y + (r.Height - image.Height) / 2);
 | 
						|
        }
 | 
						|
 | 
						|
        public static Bitmap CreateReflectionImage(Image inputImage)
 | 
						|
        {
 | 
						|
            if (inputImage == null) return null;
 | 
						|
            Bitmap tmp = new Bitmap(inputImage.Width, inputImage.Height, PixelFormat.Format32bppArgb);
 | 
						|
            using (Graphics g = Graphics.FromImage(tmp))
 | 
						|
                g.DrawImage(inputImage, 0, 0, inputImage.Width, inputImage.Height);
 | 
						|
            Bitmap image = tmp;
 | 
						|
            image.RotateFlip(RotateFlipType.Rotate180FlipX);
 | 
						|
 | 
						|
            Bitmap returnMap = new Bitmap(image.Width, image.Height,
 | 
						|
                                   PixelFormat.Format32bppArgb);
 | 
						|
            BitmapData bitmapData1 = image.LockBits(new Rectangle(0, 0,
 | 
						|
                                     image.Width, image.Height),
 | 
						|
                                     ImageLockMode.ReadOnly,
 | 
						|
                                     PixelFormat.Format32bppArgb);
 | 
						|
            BitmapData bitmapData2 = returnMap.LockBits(new Rectangle(0, 0,
 | 
						|
                                     returnMap.Width, returnMap.Height),
 | 
						|
                                     ImageLockMode.ReadOnly,
 | 
						|
                                     PixelFormat.Format32bppArgb);
 | 
						|
            unsafe
 | 
						|
            {
 | 
						|
                byte* imagePointer1 = (byte*)bitmapData1.Scan0;
 | 
						|
                byte* imagePointer2 = (byte*)bitmapData2.Scan0;
 | 
						|
                int strideOffset = bitmapData1.Stride - (bitmapData1.Width * 4);
 | 
						|
                int height = bitmapData1.Height, width = bitmapData1.Width;
 | 
						|
                for (int i = 0; i < height; i++)
 | 
						|
                {
 | 
						|
                    int alpha = Math.Max(195, (int)(265 * ((i + bitmapData1.Height * .4) / (float)bitmapData1.Height)));
 | 
						|
                    for (int j = 0; j < width; j++)
 | 
						|
                    {
 | 
						|
                        imagePointer2[0] = imagePointer1[0];
 | 
						|
                        imagePointer2[1] = imagePointer1[1];
 | 
						|
                        imagePointer2[2] = imagePointer1[2];
 | 
						|
                        imagePointer2[3] = (byte)(Math.Max(0, imagePointer1[3] - alpha));
 | 
						|
                        //4 bytes per pixel
 | 
						|
                        imagePointer1 += 4;
 | 
						|
                        imagePointer2 += 4;
 | 
						|
                    }
 | 
						|
                    //4 bytes per pixel
 | 
						|
                    imagePointer1 += strideOffset;
 | 
						|
                    imagePointer2 += strideOffset;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            returnMap.UnlockBits(bitmapData2);
 | 
						|
            image.UnlockBits(bitmapData1);
 | 
						|
            return returnMap;
 | 
						|
        }
 | 
						|
 | 
						|
        public static Bitmap CreateGrayScaleImage(Image inputImage)
 | 
						|
        {
 | 
						|
            if (inputImage == null) return null;
 | 
						|
            Bitmap image = inputImage as Bitmap;
 | 
						|
            if (inputImage.PixelFormat != PixelFormat.Format32bppArgb || image == null)
 | 
						|
            {
 | 
						|
                Bitmap tmp = new Bitmap(inputImage.Width, inputImage.Height, PixelFormat.Format32bppArgb);
 | 
						|
                using (Graphics g = Graphics.FromImage(tmp))
 | 
						|
                    g.DrawImage(inputImage, 0, 0, inputImage.Width, inputImage.Height);
 | 
						|
                image = tmp;
 | 
						|
            }
 | 
						|
 | 
						|
            Bitmap returnMap = new Bitmap(image.Width, image.Height,
 | 
						|
                                   PixelFormat.Format32bppArgb);
 | 
						|
            BitmapData bitmapData1 = image.LockBits(new Rectangle(0, 0,
 | 
						|
                                     image.Width, image.Height),
 | 
						|
                                     ImageLockMode.ReadOnly,
 | 
						|
                                     PixelFormat.Format32bppArgb);
 | 
						|
            BitmapData bitmapData2 = returnMap.LockBits(new Rectangle(0, 0,
 | 
						|
                                     returnMap.Width, returnMap.Height),
 | 
						|
                                     ImageLockMode.ReadOnly,
 | 
						|
                                     PixelFormat.Format32bppArgb);
 | 
						|
            unsafe
 | 
						|
            {
 | 
						|
                byte* imagePointer1 = (byte*)bitmapData1.Scan0;
 | 
						|
                byte* imagePointer2 = (byte*)bitmapData2.Scan0;
 | 
						|
                int strideOffset = bitmapData1.Stride - (bitmapData1.Width * 4);
 | 
						|
                int height = bitmapData1.Height, width = bitmapData1.Width;
 | 
						|
                for (int i = 0; i < height; i++)
 | 
						|
                {
 | 
						|
                    for (int j = 0; j < width; j++)
 | 
						|
                    {
 | 
						|
                        byte nB = (byte)((imagePointer1[2] + 255) / 2);
 | 
						|
                        byte nG = (byte)((imagePointer1[1] + 255) / 2);
 | 
						|
                        byte nR = (byte)((imagePointer1[0] + 255) / 2);
 | 
						|
                        nR = nG = nB = (byte)(nR * 0.299 + nG * 0.587 + nB * 0.114);
 | 
						|
 | 
						|
                        imagePointer2[0] = nR;
 | 
						|
                        imagePointer2[1] = nG;
 | 
						|
                        imagePointer2[2] = nB;
 | 
						|
                        imagePointer2[3] = imagePointer1[3];
 | 
						|
 | 
						|
                        //4 bytes per pixel
 | 
						|
                        imagePointer1 += 4;
 | 
						|
                        imagePointer2 += 4;
 | 
						|
                    }
 | 
						|
                    //4 bytes per pixel
 | 
						|
                    imagePointer1 += strideOffset;
 | 
						|
                    imagePointer2 += strideOffset;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            returnMap.UnlockBits(bitmapData2);
 | 
						|
            image.UnlockBits(bitmapData1);
 | 
						|
            return returnMap;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |