在WPF/XAML中使用Winform中的控件
<Window
x:Class="WindowsApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WinForm控件与WPF控件的交互" Height="400" Width="600"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
>
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Image Source="Girl.jpg"
MaxHeight="300" Grid.Column="0" Name="WPFImage"/>
<WindowsFormsHost Grid.Column="1" MaxHeight="300" Name="pictureHost"
>
<wf:PictureBox />
</WindowsFormsHost>
</Grid>
</StackPanel>
</Window>
C#代码:
System.Windows.Forms.PictureBox
_pictureBox = null;
void Window1_Loaded(object sender,
RoutedEventArgs e)
{
_pictureBox = pictureHost.Child
as System.Windows.Forms.PictureBox;
_pictureBox.Image =
GetBitmap(WPFImage);
}
#region Image
Functions
//
以下代码实现了两者WPF与GDI+的交互
public void ConvertToGrayscale(System.Drawing.Bitmap source , int sliderVal)
{
System.Drawing.Bitmap bm = new
System.Drawing.Bitmap(source.Width,
source.Height);
//下面代码还可以使用不安全代码,以提高效率
for (int y
= 0; y < bm.Height; y++)
{
for (int x = 0;
x < bm.Width; x++)
{
System.Drawing.Color c = source.GetPixel(x, y);
int luma
= (int)(c.R * ((double)sliderVal / (double)10) * 0.3 + c.G * ((double)sliderVal
/ (double)10) * 0.59 + c.B * ((double)sliderVal / (double)10) *
0.11);
bm.SetPixel(x, y,
System.Drawing.Color.FromArgb(luma, luma, luma));
}
}
_pictureBox.Image = bm;
}
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
浙公网安备 33010602011771号