Bitmap <-> BitmapSource 변환
/*******************************************************************************
*
* THIS CODE AND INFORMATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
* PARTICULAR PURPOSE.
*
******************************************************************************/
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows;
namespace Blog.Samples
{
public partial class MainForm : Form
{
[System.Runtime.InteropServices.DllImport ( "gdi32.dll" )]
private static extern bool DeleteObject( IntPtr hObject );
private System.Windows.Controls.Image image = new System.Windows.Controls.Image ( );
public MainForm( )
{
InitializeComponent ( );
// Setup the WinForms <-> WPF ElementHost
this.elementHost1.Child = image;
this.groupBox2.Controls.Add ( this.elementHost1 );
}
private void convertBitmapToBitmapSource_Click( object sender, EventArgs e )
{
using ( System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap ( "bitmap_to_bitmapsource.jpg" ) )
{
IntPtr hBitmap = bitmap.GetHbitmap ( );
System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap (
hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions ( ) );
image.Source = bitmapSource;
DeleteObject ( hBitmap );
}
}
private void convertBitmapSourceToBitmap_Click( object sender, EventArgs e )
{
using ( Stream stm = File.Open ( "bitmapsource_to_bitmap.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 );
// 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 );
picture.Image = bitmap;
}
}
}
}
}
}
출처 : http://rwlodarcmsdnblog.codeplex.com/SourceControl/changeset/view/37955#442080