System.Drawing.Bitmap AdjustBrightnessMatrix(System.Drawing.Bitmap img, int value)
{
if (value == 0) // No change, so just return
return img;
float sb = (float)value / 255F;
float[][] colorMatrixElements =
{
new float[] {1, 0, 0, 0, 0},
new float[] {0, 1, 0, 0, 0},
new float[] {0, 0, 1, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {sb, sb, sb, 1, 1}
};
System.Drawing.Imaging.ColorMatrix cm = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
System.Drawing.Imaging.ImageAttributes imgattr = new System.Drawing.Imaging.ImageAttributes();
System.Drawing.Rectangle rc = new System.Drawing.Rectangle(0, 0, img.Width, img.Height);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
imgattr.SetColorMatrix(cm);
g.DrawImage(img, rc, 0, 0, img.Width, img.Height, System.Drawing.GraphicsUnit.Pixel, imgattr);
imgattr.Dispose();
g.Dispose();
return img;
}
#endregion Image Functions
#region Image-Bitmap Interop Helpers
private void convertBitmapToBitmapSource(System.Drawing.Bitmap bitmap)
{
using (bitmap)
{
System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
WPFImage.Source = bitmapSource;
}
}
private System.Drawing.Bitmap GetBitmap(Image image)
{
System.Windows.Forms.PictureBox picture = _pictureBox;
// Stream stm = File.Open("Waterfall.jpg", FileMode.Open, FileAccess.Read))
//// Since we're not specifying a System.Windows.Media.Imaging.BitmapCacheOption, the pixel format
//// will be System.Windows.Media.PixelFormats.Pbgra32.
// System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Media.Imaging.BitmapFrame.Create(
// stm,
// System.Windows.Media.Imaging.BitmapCreateOptions.None,
// System.Windows.Media.Imaging.BitmapCacheOption.OnLoad);
System.Windows.Media.Imaging.BitmapSource bitmapSource = WPFImage.Source as BitmapSource;
// Scale the image so that it will display similarly to the WPF Image.
double newWidthRatio = picture.Width / (double)bitmapSource.PixelWidth;
double newHeightRatio = ((picture.Width * bitmapSource.PixelHeight) / (double)bitmapSource.PixelWidth) / (double)bitmapSource.PixelHeight;
System.Windows.Media.Imaging.BitmapSource transformedBitmapSource = new System.Windows.Media.Imaging.TransformedBitmap(
bitmapSource,
new System.Windows.Media.ScaleTransform(newWidthRatio, newHeightRatio));
int width = transformedBitmapSource.PixelWidth;
int height = transformedBitmapSource.PixelHeight;
int stride = width * ((transformedBitmapSource.Format.BitsPerPixel + 7) / 8);
byte[] bits = new byte[height * stride];
transformedBitmapSource.CopyPixels(bits, stride, 0);
unsafe
{
fixed (byte* pBits = bits)
{
IntPtr ptr = new IntPtr(pBits);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
width,
height,
stride,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb,
ptr);
return bitmap;
}
}
}
#endregion Image-Bitmap Interop Helpers
想像一下,通过相互转换、相互调用,可以很方便地实现一些功能(彼此功能互补嘛)。