C#でBitmap変数をダミーのBitmapオブジェクトで初期化する

コンピュータ

アプリケーションでBitmapオブジェクトを表示する場合、起動時表示する画像が無いので、あまり深く考えずNullをセットすることが多いです。その場合Bitmapオブジェクトの変数をNullを許容にする必要があり、その変数を使う前にNullチェックが必要になり面倒であることに最近気が付きました。

Winformsの場合

<div class="hcb_wrap"><pre class="prism line-numbers lang-csharp" data-file="MainWindow.xaml.cs" data-lang="C#"><code>namespace NotNullBmp01;

public partial class Form1 : Form
{
    Bitmap _bmp = new (1, 1); // 1x1のダミー
    public Form1()
    {
        InitializeComponent();

        PictureBox picbox = new()
        {
            Dock = DockStyle.Fill,
            Image = _bmp, // ダミーを初期値にセット
            Parent = this,
        };
    }
}
</code></pre></div>

Bitmapオブジェクトで幅と高さの0のオブジェクトが作れたら良いのですが、そのようなオブジェクトは作成できないので、幅と高さが1のオブジェクトを作成しPictureBoxにセットしています。画面上には何も表示されていないように見えますが、コンパイルは通り実行することが出来ました。

WPFの場合

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace BitmapDummy02;

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        PixelFormat pf = PixelFormats.Bgra32;
        const double dpi = 96.0d;
        const int w = 1; // 128;
        const int h = 1; // 128;
        int stride = (w * pf.BitsPerPixel + 7) / 8;
        byte[] pixels = new byte[stride * h];

        // ランダム画像
        //Random value = new();
        //value.NextBytes(pixels);

        BitmapSource bs = BitmapSource.Create(
            w, h, dpi, dpi, PixelFormats.Bgra32, null, pixels, stride);
        
        Image1.Source = bs;
    }
}

WPFでもWinFomrsと同様に1×1の画像を作成します。BitmapSourceを新規に生成していますが、ピクセルをセットするbyte配列まで作っています。これだとダミー様にリソースなどで画像ファイルを用意しそちらを割り当てる方がコード的にはすっきりしそうです。

話は変わりますが、以前ランダムな画像を作成する為、ランダムに図形を描画するプログラムを書きましたが、WPFサンプルのランダム画像のコメント部分をコメントアウトするとドットがランダムに配置された画像が出来上がります。こちらの方がコードがシンプルで良いと思います。(しかしNextBytes()なんてメソッドはこのためにあるような感じがします。)
C#でランダムな図形を描画した画像ファイルを作るプログラム
WPFで図形を描画し画像ファイルとして保存するプログラムです。 using System.Diagnostics; using System.IO; using System.Text; using System.Windows; usin...

コメント