본문 바로가기

프로그램

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