none
イベント発生でBMPの色を置換し、再表示する方法 RRS feed

  • 質問

  • はじめまして。WPF初心者です。

    WindowのImagコントロールにBMPファイルを表示し、イベント発生のタイミングで、BMPファイルの特定の色を他の色に置換する方法がわかりません。
    例えば、WindowにImageとButtonが構成されていて、ボタンを押下すると、表示されているBMPファイルの白色箇所を黄緑色に、灰色箇所を緑色に置換したいです。

    Imageを配置しているベース(Grid、StackPanel等)に背景色(Background)を設定して、System.Drawing.BitmapのMakeTransparentで特定色を透過させる方法を試したのですが、
    インスタンス生成でコンパイルエラーになります。
    System.Drawing.Imaging.ColorMap[]も試してみたのですが、技術不足で解決には至りませんでした。

    ピクセル単位で、現状の色を判定し、1ピクセル毎に色を置換する方法の他に、なにか良い方法がありましたらご教授お願いいたします。

    どうぞよろしくお願いいたします。
    2009年8月13日 1:25

回答

  • WPF の画像関連・描画関連クラスには、GDI+/System.Drawing における ColorMap のような色置換機構は用意されていないようです。WPF はベクタ指向なので、拡大縮小が入ると補間によって他の色が入るようになる(特定の色の分布が想定と異なってしまう)ためじゃないかとどなたかが推測されていたような記憶があります。
    // BitmapSource 派生クラスはビットマップ画像クラスなんですから、この辺に用意されてても良いとは思うんですけど。

    さてやり方として、まず WriteableBitmap クラスで直接ピクセルデータを書き換える方法があります。GDI+/System.Drawing における BitmapData を使用するやり方とほぼ同じです。Bitmap 画像形式に慣れているなら、さほどの手間ではないでしょう。

    もう一つは、色変換部分だけ GDI+/System.Drawing を使用する方法です。(以下、GDI+ で統一)
    注意点として、WPF のオブジェクトと GDI+ のオブジェクトは互換性がないので、やりとりはファイルまたは MemoryStream に保存されたものを使用すると言うことです。
    System.Drawing.Bitmap を既存の bmp ファイルから作成し、同サイズの Bitmap をもう一つ作り、Graphics.DrawImage で ColorMap を利用していろ変換を行います。そして色変換された Bitmap を Save で MemoryStream に保存して GDI+ 処理は終了。
    その後 WPF で、BitmapImage(StreamSource)や BitmapDecoder(Create)などを使って 先ほどの MemoryStream から BitmapSource を取得します。
    2009年8月13日 2:09
  • Window、Formに限らず、画面操作は全くの初心者です。もちろもん画像処理もです。

    取り敢えず、GDI+(System.Drawing)による処理が分からないのなら、http://dobon.net/vb/dotnet/graphics/ に一通り目を通してみてください。

    質問ですが、ImageコントロールにBitmapをBindingできるのでしょうか??

    コントロールには Binding しません。コントロールのプロパティに Binding します。Image クラスで表示する画像を指定するのは Source プロパティ であり、Source プロパティは System.Windows.Media.Imaging.ImageSource 型です。System.Drawing.Bitmap クラス は MSDN の「継承階層」を見れば分かるように ImageSource クラスからの派生クラスではありませんから、Source プロパティに Bitmap オブジェクトをバインドしても実行時エラーによって無視されるのみです。

    // ちなみに、System.Drawing.Bitmap クラスの継承階層で一つ上に Image クラスがありますが、これは System.Drawing.Image クラスであり、WPF で画像を表示するためのコントロールである System.Windows.Controls.Image クラスとは一切関係ありません。

    // String クラスは ImageSource の派生クラスではありませんが、Source プロパティに String をバインドしたりあるいは XAML で直接文字列で指定したりはできます。これは ImageSource クラスに TypeConverter 属性が付いており、この属性で指定されている ImageSourceConverter に文字列をパスとして ImageSource を生成する処理が実装されているためです。

    Source プロパティにバインドするのは ImageSource またはその派生クラスでなければなりません(文字列は可能ですけど意味がないでしょう)。

    //ファイルストリーム生成
    FileStream fileStream = new FileStream(path, FileMode.Open);
    //データ格納用バッファ生成
    byte[] fileData = new byte[fileStream.Length];
    //バッファにデータを読み込む
    fileStream.Read(fileData, 0, (int)fileStream.Length);
    fileStream.Close();
    //データを格納したバッファからMemoryStream生成
    MemoryStream memoryStream = new MemoryStream(fileData);
    //ストリームからBitmap生成
    bmp = new Bitmap(memoryStream);

    ColorMap による変換は MSDN の 方法 : カラー リマップ テーブルを使用する にサンプルコードが挙げられています。注意するのは、ColorMap による色変換は直接画像内の色を変更するものではないと言うことです。ではどういう動作なのかというと、「どこかに画像を描画する際、描画元画像の OldColor で指定された色を、描画先には NewColor で描画する」というものです。必ず「描画する(Graphics クラスの DrawImage メソッドを呼び出す)」という動作が必要です。

    描画先を指す Graphics オブジェクトは、ウィンドウやプリンタ、あるいは画像そのものなどから作成できます。サンプルでは e.Graphics なる正体不明の Graphics オブジェクトに対して描画処理を行っています。

    まず「色変換の元となる画像」を用意します(GDI+ においてビットマップ画像(ラスタ画像)は Bitmap クラスで扱います)。これは上記サンプルを見ればファイルから作成する方法は分かるでしょう(参考:Bitmap コンストラクタ )。

    次に、「色変換を行う際の描画先となる画像」を用意します。描画先の画像は、当然元の画像と縦横のサイズが同じでないといけません。Bitmap コンストラクタには縦横のサイズを指定できるものが用意されています(上で挙げた Bitmap コンストラクタ一覧を確認してください)。

    描画先を指す Graphics は、画像(Bitmap オブジェクト)からは Graphics.FromImage メソッドによって作成できます。この FromImage によって作成した Graphics オブジェクトを、サンプルコードの e.Graphics の代わりに使用します。

    DrawImage メソッド は様々な引数を指定することができるメソッドです。これらのうち、ImageAttributes を指定できるのが必要です。ImageAttributes を指定できるのは複雑なのばかりですが、DrawImage(Image, Rectangle, Int32, Int32, Int32, Int32, GraphicsUnit, ImageAttributes) 辺りがまだましでしょうかね。カラーリマップテーブルのサンプルコードでもこれを使っていますし。引数の意味をよく確認して適切に指定してください。

    これで「描画先となる画像」Bitmap オブジェクトには、色変換済みの画像が格納されていることになります(ちなみに当然ながら「色変換の元となる画像」Bitmap オブジェクトは変更ありません)。しかし、何度も言うように GDI+ の System.Drawing.Bitmap オブジェクトは WPF では扱うことができません。そのため、WPF で扱える形に変更する必要があります。

    最も理解しやすいのが、ファイルを使って相互にデータをやりとりする方法です。GDI+ でも WPF でも、画像のファイルへの保存・ファイルからの読み込みはサポートしています。画像ファイルは bmp なり png なりといった画像ファイルフォーマットによって成り立つため、GDI+ とか WPF とかの差異はありません(まあそれぞれ扱えないファイルフォーマットはありますが)。

    しかし色変換のためだけに一々一時ファイルを用意するのは馬鹿馬鹿しいので、ファイルの代わりに MemoryStream に保存して読み込みます。

    GDI+ では、画像の保存に Bitmap オブジェクトの Save メソッド を使用します。画像形式には保存時に劣化しない Bmp か Png を。

    WPF において画像の読み込みは主に二種類の方法が存在します。一つは、BitmapImage クラス を使用する方法。クラス解説の使用例では UriSource を使っていますが、ストリームを読み込み元とする場合 StreamSource プロパティを使用します。もう一つは BitmapDecoder クラス です。使用例で Create の第一引数に Uri を指定していますが、その代わりにストリームを指定することができます。

    最後に、Bitmap クラス及び Graphics クラスは IDisposable です。using 構文を使って、使い終わったらさっさと破棄するようにしましょう。

    2009年8月14日 19:33

  • NIM5様、えムナウ様、Hongliang様

    アドバイスありがとうございました。

    bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);

    を追加することで解決いたしました。

    どうもありがとうございました。

    2009年8月21日 13:06

すべての返信

  • WPF の画像関連・描画関連クラスには、GDI+/System.Drawing における ColorMap のような色置換機構は用意されていないようです。WPF はベクタ指向なので、拡大縮小が入ると補間によって他の色が入るようになる(特定の色の分布が想定と異なってしまう)ためじゃないかとどなたかが推測されていたような記憶があります。
    // BitmapSource 派生クラスはビットマップ画像クラスなんですから、この辺に用意されてても良いとは思うんですけど。

    さてやり方として、まず WriteableBitmap クラスで直接ピクセルデータを書き換える方法があります。GDI+/System.Drawing における BitmapData を使用するやり方とほぼ同じです。Bitmap 画像形式に慣れているなら、さほどの手間ではないでしょう。

    もう一つは、色変換部分だけ GDI+/System.Drawing を使用する方法です。(以下、GDI+ で統一)
    注意点として、WPF のオブジェクトと GDI+ のオブジェクトは互換性がないので、やりとりはファイルまたは MemoryStream に保存されたものを使用すると言うことです。
    System.Drawing.Bitmap を既存の bmp ファイルから作成し、同サイズの Bitmap をもう一つ作り、Graphics.DrawImage で ColorMap を利用していろ変換を行います。そして色変換された Bitmap を Save で MemoryStream に保存して GDI+ 処理は終了。
    その後 WPF で、BitmapImage(StreamSource)や BitmapDecoder(Create)などを使って 先ほどの MemoryStream から BitmapSource を取得します。
    2009年8月13日 2:09
  • すこし変わったアプローチとして、.NET 3.5 SP1 から対応した、PixelShaderを使ってみてはいかがでしょうか。
    最初は少し敷居がありますが、一度やってしまえばものすごく簡単にできます。


    PixelShader を使用するための下準備
    http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=14962

    Shader Effects BuildTask and Templates.zip を解凍してインストールしてください。

    サンプルコード
    http://www.codeplex.com/wpffx


    おもしろそうなので、試しにやってみました。置換前の色(ReplaceColor)と置換後の色(NewColor)、あと、置換前の色の許容範囲(near 0.0~1.0)を指定できるShaderEffectを作ってみました。
    サンプルにある WPFPixelShaderLibrary プロジェクトを、自分のアプリのソリューションに組み込んで、参照設定で、WPFPixelShaderLibrary.dll を設定し、namespaceを通します。

    using ShaderEffectLibrary;

    次に、すでに沢山エフェクトが入っているものから適当にコピペして、csファイルとfxファイルを新規に追加します。
    ちょうど、ColorTone.cs と ColorTone.fx が、色のパラメータを二つ使用するので、これをコピペして、ReplaceColor.cs と ReplaceColor.fxを追加ました。
    尚、fxファイルを追加する際に、ファイルのビルドアクションが Effect になっていることを確認してください。

    コピペしたColorTone.csのクラス名を、↓のように変更します。
    public class ColorReplaceEffect : ShaderEffect

    このクラスの中に、Color型の依存関係プロパティが二つあるので、これを通じて置換前の色と置換後の色を指定します。
    また、float型のプロパティもあるので、ここで許容範囲を指定します。
    プロパティ名も気になるようなら変更してください。

    次に fx ファイルですが、これは HLSL 言語で記述します。私は下記のようにしてみましたので、参考までに。

    //--------------------------------------------------------------------------------------
    // 
    // WPF ShaderEffect HLSL -- ColorReplace
    //
    //--------------------------------------------------------------------------------------
    //-----------------------------------------------------------------------------------------
    // Shader constant register mappings (scalars - float, double, Point, Color, Point3D, etc.)
    //-----------------------------------------------------------------------------------------
    float near : register(C0);
    float4 ReplaceColor : register(C2);
    float4 NewColor : register(C3);
    
    //--------------------------------------------------------------------------------------
    // Sampler Inputs (Brushes, including ImplicitInput)
    //--------------------------------------------------------------------------------------
    sampler2D implicitInputSampler : register(S0);
    
    //--------------------------------------------------------------------------------------
    // Pixel Shader
    //--------------------------------------------------------------------------------------
    float4 main(float2 uv : TEXCOORD) : COLOR
    {
        float4 retColor = tex2D(implicitInputSampler, uv);
        if( abs(retColor.r - ReplaceColor.r) < near &&
            abs(retColor.g - ReplaceColor.g) < near &&
            abs(retColor.b - ReplaceColor.b) < near &&
            abs(retColor.a - ReplaceColor.a) < near )
        {
            retColor = NewColor;
        }
        return retColor;
    }


    これをビルドした後、エフェクトをかけたい Image の Effect プロパティを設定します。
    ためしに、許容範囲をスライダーで変更できるようにしてみました。

    <Image x:Name="image" Source="image.png">
      <Image.Effect>
        <ShaderEffectLibrary:ColorReplaceEffect ReplaceColor="#FFFEFEFE" NewColor="#FF950000" Near="{Binding Value, ElementName=slider, Mode=Default}"/>
      </Image.Effect>
    </Image>
    
    <Slider x:Name="slider" LargeChange="0.1" TickFrequency="0.1" Maximum="1.0"/>
    



    置換するためだけに、PixelShaderを持ち出すか?という気もしますが、実際、なれれば簡単にできますし、GPUがまともなら処理はあほみたいに速いし、色々応用も利きますので、試してみてはいかがでしょうか。
    • 編集済み NIM5 2009年8月13日 3:19 どうしても、コードの所にゴミが入る・・・
    2009年8月13日 3:06
  • BMPファイルじゃなくて透過設定済みのPNGファイルを使ってみてください。
    2色同時に変更することはできませんが背景色は変更可能になります。
    2009年8月13日 10:03
  • Hongliang様

    アドバイスありがとうございます。
    Window、Formに限らず画面について全くの初心者です。もちろん画像処理もです・・・

    色々模索して、まずBMPファイルをFileStreamでバッファに、読みこみ、バッファからMemoryStreamに保存し、ストリームからBitmapを生成してみました。
    色置換は第二段階として、まずWindowのImageコントロールにストリームから生成したBitmapをBindingして表示できるところまで試してみましたが、表示できませんでした。

    Imageコントロールに、BitmapをBindingできるのしょうか?

    念のためソースを記述しておきます。見当違いなことをしていましたら申し訳ありません。。

    --Xaml--
    <Image Source="{Binding BMP }"></Image>
    -----------------------------------------------------------

    --プロパティ--
    private Bitmap bmp = null;
    public Bitmap BMP { get { return bmp; } }

    --処理--
    //ファイルストリーム生成
    FileStream fileStream = new FileStream(path, FileMode.Open);

    //データ格納用バッファ生成
    byte[] fileData = new byte[fileStream.Length];

    //バッファにデータを読み込む
    fileStream.Read(fileData, 0, (int)fileStream.Length);

    fileStream.Close();

    //データを格納したバッファからMemoryStream生成
    MemoryStream memoryStream = new MemoryStream(fileData);

    //ストリームからBitmap生成
    bmp = new Bitmap(memoryStream);

    2009年8月14日 9:34
  • Hongliang様

    アドバイスありがとうございます。

    Window、Formに限らず、画面操作は全くの初心者です。もちろもん画像処理もです。。

    後者のやり方で色々試してみました。

    色変換処理はひとまずおいて、まず、FileStreamで読み込んだBMPファイルデータを、バッファに読み込んで、
    MemoryStreamからBitmapを作成して、Imgaeコントロールに表示できるか試してみました。
    しかし、Windowには表示できませんでした。

    質問ですが、ImageコントロールにBitmapをBindingできるのでしょうか??

    以下に、コードを記述してみました。
    見当違いなやり方でしたら申し訳ありません。。

    --xaml--
    <Image Grid.Row="0" Name="aaa" Source="{Binding BMP}"></Image>

    --プロパティ--
    private Bitmap bmp = null;
    public Bitmap BMP { get { return bmp; } }

    --処理--
    //ファイルストリーム生成
    FileStream fileStream = new FileStream(path, FileMode.Open);

    //データ格納用バッファ生成
    byte[] fileData = new byte[fileStream.Length];

    //バッファにデータを読み込む
    fileStream.Read(fileData, 0, (int)fileStream.Length);

    fileStream.Close();

    //データを格納したバッファからMemoryStream生成
    MemoryStream memoryStream = new MemoryStream(fileData);

    //ストリームからBitmap生成
    bmp = new Bitmap(memoryStream);


    2009年8月14日 9:48
  • Window、Formに限らず、画面操作は全くの初心者です。もちろもん画像処理もです。

    取り敢えず、GDI+(System.Drawing)による処理が分からないのなら、http://dobon.net/vb/dotnet/graphics/ に一通り目を通してみてください。

    質問ですが、ImageコントロールにBitmapをBindingできるのでしょうか??

    コントロールには Binding しません。コントロールのプロパティに Binding します。Image クラスで表示する画像を指定するのは Source プロパティ であり、Source プロパティは System.Windows.Media.Imaging.ImageSource 型です。System.Drawing.Bitmap クラス は MSDN の「継承階層」を見れば分かるように ImageSource クラスからの派生クラスではありませんから、Source プロパティに Bitmap オブジェクトをバインドしても実行時エラーによって無視されるのみです。

    // ちなみに、System.Drawing.Bitmap クラスの継承階層で一つ上に Image クラスがありますが、これは System.Drawing.Image クラスであり、WPF で画像を表示するためのコントロールである System.Windows.Controls.Image クラスとは一切関係ありません。

    // String クラスは ImageSource の派生クラスではありませんが、Source プロパティに String をバインドしたりあるいは XAML で直接文字列で指定したりはできます。これは ImageSource クラスに TypeConverter 属性が付いており、この属性で指定されている ImageSourceConverter に文字列をパスとして ImageSource を生成する処理が実装されているためです。

    Source プロパティにバインドするのは ImageSource またはその派生クラスでなければなりません(文字列は可能ですけど意味がないでしょう)。

    //ファイルストリーム生成
    FileStream fileStream = new FileStream(path, FileMode.Open);
    //データ格納用バッファ生成
    byte[] fileData = new byte[fileStream.Length];
    //バッファにデータを読み込む
    fileStream.Read(fileData, 0, (int)fileStream.Length);
    fileStream.Close();
    //データを格納したバッファからMemoryStream生成
    MemoryStream memoryStream = new MemoryStream(fileData);
    //ストリームからBitmap生成
    bmp = new Bitmap(memoryStream);

    ColorMap による変換は MSDN の 方法 : カラー リマップ テーブルを使用する にサンプルコードが挙げられています。注意するのは、ColorMap による色変換は直接画像内の色を変更するものではないと言うことです。ではどういう動作なのかというと、「どこかに画像を描画する際、描画元画像の OldColor で指定された色を、描画先には NewColor で描画する」というものです。必ず「描画する(Graphics クラスの DrawImage メソッドを呼び出す)」という動作が必要です。

    描画先を指す Graphics オブジェクトは、ウィンドウやプリンタ、あるいは画像そのものなどから作成できます。サンプルでは e.Graphics なる正体不明の Graphics オブジェクトに対して描画処理を行っています。

    まず「色変換の元となる画像」を用意します(GDI+ においてビットマップ画像(ラスタ画像)は Bitmap クラスで扱います)。これは上記サンプルを見ればファイルから作成する方法は分かるでしょう(参考:Bitmap コンストラクタ )。

    次に、「色変換を行う際の描画先となる画像」を用意します。描画先の画像は、当然元の画像と縦横のサイズが同じでないといけません。Bitmap コンストラクタには縦横のサイズを指定できるものが用意されています(上で挙げた Bitmap コンストラクタ一覧を確認してください)。

    描画先を指す Graphics は、画像(Bitmap オブジェクト)からは Graphics.FromImage メソッドによって作成できます。この FromImage によって作成した Graphics オブジェクトを、サンプルコードの e.Graphics の代わりに使用します。

    DrawImage メソッド は様々な引数を指定することができるメソッドです。これらのうち、ImageAttributes を指定できるのが必要です。ImageAttributes を指定できるのは複雑なのばかりですが、DrawImage(Image, Rectangle, Int32, Int32, Int32, Int32, GraphicsUnit, ImageAttributes) 辺りがまだましでしょうかね。カラーリマップテーブルのサンプルコードでもこれを使っていますし。引数の意味をよく確認して適切に指定してください。

    これで「描画先となる画像」Bitmap オブジェクトには、色変換済みの画像が格納されていることになります(ちなみに当然ながら「色変換の元となる画像」Bitmap オブジェクトは変更ありません)。しかし、何度も言うように GDI+ の System.Drawing.Bitmap オブジェクトは WPF では扱うことができません。そのため、WPF で扱える形に変更する必要があります。

    最も理解しやすいのが、ファイルを使って相互にデータをやりとりする方法です。GDI+ でも WPF でも、画像のファイルへの保存・ファイルからの読み込みはサポートしています。画像ファイルは bmp なり png なりといった画像ファイルフォーマットによって成り立つため、GDI+ とか WPF とかの差異はありません(まあそれぞれ扱えないファイルフォーマットはありますが)。

    しかし色変換のためだけに一々一時ファイルを用意するのは馬鹿馬鹿しいので、ファイルの代わりに MemoryStream に保存して読み込みます。

    GDI+ では、画像の保存に Bitmap オブジェクトの Save メソッド を使用します。画像形式には保存時に劣化しない Bmp か Png を。

    WPF において画像の読み込みは主に二種類の方法が存在します。一つは、BitmapImage クラス を使用する方法。クラス解説の使用例では UriSource を使っていますが、ストリームを読み込み元とする場合 StreamSource プロパティを使用します。もう一つは BitmapDecoder クラス です。使用例で Create の第一引数に Uri を指定していますが、その代わりにストリームを指定することができます。

    最後に、Bitmap クラス及び Graphics クラスは IDisposable です。using 構文を使って、使い終わったらさっさと破棄するようにしましょう。

    2009年8月14日 19:33
  • Hongliang

    丁寧に教えていただき、ありがとうございます。
    アドバイス頂いた内容を参考に、試してみました。

    ImageコントロールのSourceは、BitmapImage型で定義したメンバをBindingすることにしました。
    FileStreamでファイルから、読み込んだデータからMemoryStreamを生成し、BitmapImageのStreamSourceプロパティに割り当てました。
    その結果、Windowに期待する画像が表示されるようになりました。(^▽^)

    メモリからの表示はできたので、色変換の処理を考えました。
    BitmapはMemoryStreamを使用してインスタンスを作成しました。
    そのBitmapのGraphicsオブジェクトを取得し、色変換を定義したColorMapをImageAttributesオブジェクトに設定しました。
    GraphicsのDrawImageで、ImageAttributesを指定して色変換を行い、BitmapImageのStreamSourceプロパティに設定してみましたが、またまたコンパイルエラーが発生しました。。。

    BitmapImageの初期化終了時にエラーになるのですが、どこがいけないのかわからないので、ご教授お願いいたします。


                //ファイルストリーム生成
                FileStream fileStream = new FileStream("C://work/micky.bmp", FileMode.Open);
                //データ格納用バッファ生成
                byte[] fileData = new byte[fileStream.Length];
                //バッファにデータを読み込む
                fileStream.Read(fileData, 0, (int)fileStream.Length);
                fileStream.Close();
                //データを格納したバッファからMemoryStream生成
                MemoryStream memoryStream = new MemoryStream(fileData);
    
                Bitmap bitmap = new Bitmap(memoryStream);
                //BitmapのGraphicsオブジェクトを取得
                Graphics g = Graphics.FromImage(bitmap);
                
                System.Drawing.Imaging.ColorMap[] cms =
                 new System.Drawing.Imaging.ColorMap[] { new System.Drawing.Imaging.ColorMap(), new System.Drawing.Imaging.ColorMap() };
                //白を黒に変換する
                cms[0].OldColor = Color.White;
                cms[0].NewColor = Color.Black;
                //黒を白に変換する
                cms[1].OldColor = Color.Black;
                cms[1].NewColor = Color.White;
    
                //ImageAttributesオブジェクトの作成
                System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes();
                //ColorMapを設定
                ia.SetRemapTable(cms);
    
                //色を変換する
                g.DrawImage(bitmap, new Rectangle(bitmap.Width + 10, 0, bitmap.Width, bitmap.Height), 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, ia);
    
                //リソースを開放する
                g.Dispose();
    
                //ストリームからBitmapImage生成
                BitmapImage work = new BitmapImage();
                work.BeginInit();
                work.StreamSource = memoryStream;
                work.EndInit();
    
                source = work;            //ImageコントロールのSourceプロパティのBindingデータ

    2009年8月21日 9:19

  • NIM5様、えムナウ様、Hongliang様

    アドバイスありがとうございました。

    bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);

    を追加することで解決いたしました。

    どうもありがとうございました。

    2009年8月21日 13:06