none
WPFで高精度ビットマップの扱いがわからない RRS feed

  • 質問

  • WPFで浮動小数点カラーの画像を保存する場合には、WindowsMediaPhotoを使うらしいということはわかったのですが、System.Windows.Mediaを調べてもいまいちわからない点があります。

    ・浮動小数点カラーのビットマップを作成する場合、どのクラスを使えばいいんでしょうか。
    ・GDI+のビットマップのGetPixel/SetPixelに相当するメソッドはどのクラスにあるんでしょうか。

    教えていただけると幸いです。

     

    2006年7月4日 14:13

回答

  • キツネさん、ご返信ありがとうございます。とても助かります。

    やはりGetPixel/SetPixelは見当たらないようですね。struct System.Windows.Media.Colorなんてのがあるので、これを使おうかと思ったんですが・・・。もしかしたらまだ公開されていないだけかもしれませんが。

    ビットマップの加工などは確かにbyte[]かポインタを使えばいいと思うんですが、点でグラフを書きたいときなんかはSetPixelは手軽でいいですよね。本当になくなっちゃうんでしょうか。

    今でもオブジェクト指向的でないプログラミングのほうがわかりやすいときがあるように、GetPixel/SetPixelみたいな遅いけど直感的なメソッドが使いやすいときってかなりあると思います。絶対になくさないでほしいです。新しいもののために古くて使いやすいものをあえて排除することもないと思うので。

     

    2006年7月14日 22:29

すべての返信

  • 自信はありませんが、GDI+ のGetPixel/SetPixel に相当するメソッドはなさそうです。
    その代わり、BitmapSource.Create でイメージを生成できるので、これが利用できそうです。
    以下のコードは画像を反転表示するためのサンプルコードです。
    浮動小数点カラーのビットマップも同じだと思うのですがいかがでしょうか。

    // Window1.xaml

    <Button ...(省略)... Click="button1_Click">Button</Button>
    <Image x:Name="imageDisplay" Source="C:\fox.bmp" />

     //Window1.xaml.cs

    private void button1_Click(object sender, EventArgs e)
    {
        double dpi = 96;
        int height = 730;
        int width = 984;
        int stride = 6000;
       
        BitmapSource beforeBMP = (BitmapSource)imageDisplay.Source;
       
        byte[] beforePixels = new byte[5000000];
        beforeBMP.CopyPixels(beforePixels, stride, 0);
        byte[] afterPixels = new byte[5000000];

        for (int cnt = 0; cnt < beforePixels.Length; cnt++)
        {
                afterPixels[cnt] = (byte) (~beforePixels[cnt]);
        }

        BitmapSource afterBMP = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr32, null, afterPixels, stride);
        imageDisplay.Source = afterBMP;
    }

     

    2006年7月14日 16:27
  • キツネさん、ご返信ありがとうございます。とても助かります。

    やはりGetPixel/SetPixelは見当たらないようですね。struct System.Windows.Media.Colorなんてのがあるので、これを使おうかと思ったんですが・・・。もしかしたらまだ公開されていないだけかもしれませんが。

    ビットマップの加工などは確かにbyte[]かポインタを使えばいいと思うんですが、点でグラフを書きたいときなんかはSetPixelは手軽でいいですよね。本当になくなっちゃうんでしょうか。

    今でもオブジェクト指向的でないプログラミングのほうがわかりやすいときがあるように、GetPixel/SetPixelみたいな遅いけど直感的なメソッドが使いやすいときってかなりあると思います。絶対になくさないでほしいです。新しいもののために古くて使いやすいものをあえて排除することもないと思うので。

     

    2006年7月14日 22:29