【WPF学習中】Bitmapにピクセル単位で描画

コンピュータ
WPFでBitmap画像に対しピクセル単位で描画する方法を探したところ、byte配列でピクセルデータを用意し、そのbyte配列をWriteableBitmapオブジェクトに書き込む方法が見つかりましたので試してみます。

プロジェクトの作成

PowerShellで実行。要dotnet.exe
mkdir WriteableBitmapSample
cd WriteableBitmapSample
dotnet new wpf
code .

ソースコード

<Window x:Class="WriteableBitmapSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WriteableBitmapSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Image x:Name="image1" Stretch="None" />
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

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

            const int width = 256;
            const int height = 256;

            var wb = new WriteableBitmap(width, height, 75, 75, PixelFormats.Bgra32, null);

            int pixelsSize = (width * 4) * height;
            byte[] pixels = new byte[pixelsSize];

            for (int y = 0; y < height; y++)
            {
                for(int x = 0; x < width; x++)
                {
                    int v = x + (width * y);
                    int i = (x * 4) + (y * (width * 4));
                    
                    //byte b = (byte)((v & 0xFF0000) / (256 * 256));
                    byte b = 0xFF;
                    byte g = (byte)((v & 0x00FF00) / 256);
                    byte r = (byte)(v & 0x0000FF);
                    byte a = 0xFF;
                    
                    pixels[i] = b;
                    pixels[i+1] = g;
                    pixels[i+2] = r;
                    pixels[i+3] = a;
                }
            }

            wb.WritePixels(new Int32Rect(0, 0, width, height), pixels, (width * 4), 0, 0);
            image1.Source = wb;
        }
    }
}

ビルド

dotnet build

実行


なるべく沢山の色が表示されるようにしてみました。

コメント