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