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;
 | |
|         }
 | |
|     }
 | |
| }
 |