質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

6029閲覧

System.Drawing.BitmapをSystem.Windows.Controls.Imageに変換したいです。

cancat

総合スコア313

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2016/12/05 10:59

こんにちは。
Windows10でWPFのアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
System.Drawing.BitmapをSystem.Windows.Controls.Imageに変換したいです。

###発生している問題・エラーメッセージ
hBitmap = original.GetHbitmap();//<=この行でメモリ不足のエラーが出ます。
1280*1024ピクセル程度で300KBです。

###該当のソースコード

C#

1 [System.Runtime.InteropServices.DllImport("gdi32.dll")] 2 public static extern bool DeleteObject(IntPtr hObject); 3 public static System.Windows.Controls.Image 4 SystemDrawingBitmap2SystemWindowsControlsImage(System.Drawing.Bitmap original) { 5 6 IntPtr hBitmap = new IntPtr(); 7 System.Windows.Controls.Image newimage = null; 8 try { 9 hBitmap = original.GetHbitmap();//<=この行でメモリ不足のエラーが出ます。 10 newimage = new System.Windows.Controls.Image(); 11 newimage.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( 12 hBitmap, 13 IntPtr.Zero, 14 Int32Rect.Empty, 15 System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 16 } 17 finally { 18 DeleteObject(hBitmap); 19 } 20 return newimage; 21 }

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

該当のソースコードに記載のコードをそのまま動かしてみましたがメモリ不足のエラーは出ず普通に動作しました。
環境はちょっと違います。

Microsoft Visual Studio Community 2017
Version 15.6.7
Microsoft .NET Framework
Version 4.7.1

OS は Windows 10 です。

読み込ませた画像は 1920 x 1080(4MB) です。

主題からは外れますが、System.Drawing.Bitmapは画像オブジェクト、それに対してSystem.Windows.Controls.ImageはUIコントロールです。異なる種類のオブジェクトへの変換なのでちょっと変です。

以下の方針が良いのではないかと思います。

  • System.Drawing.Bitmapの変換はSystem.Windows.Media.Imaging.BitmapSource(=System.Windows.Media.ImageSource) までに留めておく。
  • System.Windows.Controls.Imageは通常通りXAML上に配置し、Sourceに変換したImageSourceをBindingする。

サンプルは以下の通りです。画像が表示されるところまで確認しています。
該当のソースコードの作り方を継承してユーティリティクラス風に作っていますが、IValueConverter形式に作り替えて使っても大丈夫だと思います。

ImageConverter.cs

C#

1using System; 2using System.Windows; 3 4namespace WpfApp2 5{ 6 class ImageConverter 7 { 8 [System.Runtime.InteropServices.DllImport("gdi32.dll")] 9 public static extern bool DeleteObject(IntPtr hObject); 10 11 public static System.Windows.Media.Imaging.BitmapSource 12 SystemDrawingBitmap2SystemWindowsMediaImagingBitmapSource(System.Drawing.Bitmap original) 13 { 14 IntPtr hBitmap = new IntPtr(); 15 try 16 { 17 hBitmap = original.GetHbitmap(); 18 return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( 19 hBitmap, 20 IntPtr.Zero, 21 Int32Rect.Empty, 22 System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 23 } 24 finally 25 { 26 DeleteObject(hBitmap); 27 } 28 } 29 } 30}

MainWindowViewModel.cs

C#

1using System.Windows.Media; 2 3namespace WpfApp2 4{ 5 class MainWindowViewModel 6 { 7 public ImageSource Image1 { get; set; } 8 9 public MainWindowViewModel() 10 { 11 var bitmap = new System.Drawing.Bitmap(@"test.bmp"); 12 Image1 = ImageConverter.SystemDrawingBitmap2SystemWindowsMediaImagingBitmapSource(bitmap); 13 } 14 } 15}

MainWindow.xaml

XML

1<Window x:Class="WpfApp2.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 mc:Ignorable="d" 7 Title="MainWindow" Height="450" Width="800"> 8 <StackPanel> 9 <Image Source="{Binding Image1}" /> 10 </StackPanel> 11</Window>

MainWindow.xaml.cs

C#

1using System.Windows; 2 3namespace WpfApp2 4{ 5 public partial class MainWindow : Window 6 { 7 public MainWindow() 8 { 9 InitializeComponent(); 10 DataContext = new MainWindowViewModel(); 11 } 12 } 13}

投稿2018/04/30 01:01

toydev

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問