WriteableBitmap クラス

定義

書き込みおよび更新が可能な BitmapSource を提供します。

public ref class WriteableBitmap sealed : System::Windows::Media::Imaging::BitmapSource
public sealed class WriteableBitmap : System.Windows.Media.Imaging.BitmapSource
type WriteableBitmap = class
    inherit BitmapSource
Public NotInheritable Class WriteableBitmap
Inherits BitmapSource
継承

次の例では、 を WriteableBitmap のソースとして使用して、マウスの Image 移動時にピクセルを描画する方法を示します。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Input;

namespace WriteableBitmapDemo
{
    class Program
    {
        static WriteableBitmap writeableBitmap;
        static Window w;
        static Image i;

        [STAThread]
        static void Main(string[] args)
        {
            i = new Image();
            RenderOptions.SetBitmapScalingMode(i, BitmapScalingMode.NearestNeighbor);
            RenderOptions.SetEdgeMode(i, EdgeMode.Aliased);
           
            w = new Window();
            w.Content = i;
            w.Show();

            writeableBitmap = new WriteableBitmap(
                (int)w.ActualWidth, 
                (int)w.ActualHeight, 
                96, 
                96, 
                PixelFormats.Bgr32, 
                null);

            i.Source = writeableBitmap;

            i.Stretch = Stretch.None;
            i.HorizontalAlignment = HorizontalAlignment.Left;
            i.VerticalAlignment = VerticalAlignment.Top;

            i.MouseMove += new MouseEventHandler(i_MouseMove);
            i.MouseLeftButtonDown += 
                new MouseButtonEventHandler(i_MouseLeftButtonDown);
            i.MouseRightButtonDown += 
                new MouseButtonEventHandler(i_MouseRightButtonDown);

            w.MouseWheel += new MouseWheelEventHandler(w_MouseWheel);

            Application app = new Application();
            app.Run();
        }

        // The DrawPixel method updates the WriteableBitmap by using
        // unsafe code to write a pixel into the back buffer.
        static void DrawPixel(MouseEventArgs e)
        {
            int column = (int)e.GetPosition(i).X;
            int row = (int)e.GetPosition(i).Y;

            try{
                // Reserve the back buffer for updates.
                writeableBitmap.Lock();

                unsafe
                {
                    // Get a pointer to the back buffer.
                    IntPtr pBackBuffer = writeableBitmap.BackBuffer;

                    // Find the address of the pixel to draw.
                    pBackBuffer += row * writeableBitmap.BackBufferStride;
                    pBackBuffer += column * 4;

                    // Compute the pixel's color.
                    int color_data = 255 << 16; // R
                    color_data |= 128 << 8;   // G
                    color_data |= 255 << 0;   // B

                    // Assign the color data to the pixel.
                    *((int*) pBackBuffer) = color_data;
                }
    
                // Specify the area of the bitmap that changed.
                writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1));
            }
            finally{
                // Release the back buffer and make it available for display.
                writeableBitmap.Unlock();
            }
        }

        static void ErasePixel(MouseEventArgs e)
        {
            byte[] ColorData = { 0, 0, 0, 0 }; // B G R

            Int32Rect rect = new Int32Rect(
                    (int)(e.GetPosition(i).X), 
                    (int)(e.GetPosition(i).Y), 
                    1, 
                    1);

            writeableBitmap.WritePixels( rect, ColorData, 4, 0);
        }

        static void i_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            ErasePixel(e);
        }

        static void i_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DrawPixel(e);
        }

        static void i_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                DrawPixel(e);
            }
            else if (e.RightButton == MouseButtonState.Pressed)
            {
                ErasePixel(e);
            }
        }

        static void w_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            System.Windows.Media.Matrix m = i.RenderTransform.Value;

            if (e.Delta > 0)
            {
                m.ScaleAt(
                    1.5, 
                    1.5, 
                    e.GetPosition(w).X, 
                    e.GetPosition(w).Y);
            }
            else
            {
                m.ScaleAt(
                    1.0 / 1.5, 
                    1.0 / 1.5, 
                    e.GetPosition(w).X, 
                    e.GetPosition(w).Y);
            }

            i.RenderTransform = new MatrixTransform(m);
        }
    }
}

注釈

クラスを WriteableBitmap 使用して、フレームごとにビットマップを更新およびレンダリングします。 これは、フラクタル画像などのアルゴリズムコンテンツを生成する場合や、音楽ビジュアライザーなどのデータ視覚化に役立ちます。

クラスは WriteableBitmap 2 つのバッファーを使用します。 バック バッファーはシステム メモリに割り当てられ、現在表示されていないコンテンツが蓄積されます。 フロント バッファーはシステム メモリに割り当てられ、現在表示されているコンテンツが含まれています。 レンダリング システムは、表示のためにフロント バッファーをビデオ メモリにコピーします。

2 つのスレッドでこれらのバッファーが使用されます。 ユーザー インターフェイス (UI) スレッドによって UI が生成されますが、画面には表示されません。 UI スレッドは、ユーザー入力、タイマー、およびその他のイベントに応答します。 アプリケーションには複数の UI スレッドを含めることができます。 レンダリング スレッドは、UI スレッドから変更を作成してレンダリングします。 アプリケーションごとにレンダリング スレッドは 1 つだけです。

UI スレッドは、コンテンツをバック バッファーに書き込みます。 レンダー スレッドは、フロント バッファーからコンテンツを読み取り、ビデオ メモリにコピーします。 バック バッファーへの変更は、変更された四角形領域で追跡されます。

いずれかのオーバーロードを WritePixels 呼び出して、バック バッファー内のコンテンツを自動的に更新して表示します。

更新をより細かく制御し、バック バッファーへのマルチスレッド アクセスを行う場合は、次のワークフローを使用します。

  1. メソッドを Lock 呼び出して、更新プログラムのバック バッファーを予約します。

  2. プロパティにアクセスして、バック バッファーへのポインターを BackBuffer 取得します。

  3. バック バッファーに変更を書き込みます。 がロックされている場合、他のスレッドがバック バッファーに変更を WriteableBitmap 書き込む場合があります。

  4. メソッドを AddDirtyRect 呼び出して、変更された領域を示します。

  5. メソッドを Unlock 呼び出してバック バッファーを解放し、画面へのプレゼンテーションを許可します。

更新がレンダリング スレッドに送信されると、レンダリング スレッドは、変更された四角形をバック バッファーからフロント バッファーにコピーします。 レンダリング システムは、デッドロックを回避し、"ティアリング" などの成果物を再描画するために、この交換を制御します。

コンストラクター

WriteableBitmap(BitmapSource)

指定した WriteableBitmap を使用して、BitmapSource クラスの新しいインスタンスを初期化します。

WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette)

指定したパラメーターを使用して、WriteableBitmap クラスの新しいインスタンスを初期化します。

プロパティ

BackBuffer

バック バッファーへのポインターを取得します。

BackBufferStride

1 行のピクセル データのバイト数を示す値を取得します。

CanFreeze

オブジェクトを変更不可能にできるかどうかを示す値を取得します。

(継承元 Freezable)
DependencyObjectType

このインスタンスの DependencyObjectType CLR 型をラップする を取得します。

(継承元 DependencyObject)
Dispatcher

この Dispatcher が関連付けられている DispatcherObject を取得します。

(継承元 DispatcherObject)
DpiX

イメージの水平方向のドット /インチ (dpi) を取得します。

(継承元 BitmapSource)
DpiY

イメージの垂直ドット /インチ (dpi) を取得します。

(継承元 BitmapSource)
Format

ビットマップ データのネイティブ PixelFormat を取得します。

(継承元 BitmapSource)
HasAnimatedProperties

1 つ以上の AnimationClock オブジェクトが、このオブジェクトの任意の依存関係プロパティに関連付けられているかどうかを示す値を取得または設定します。

(継承元 Animatable)
Height

デバイスに依存しない単位 (単位あたり 1/96 インチ) のソース ビットマップの高さを取得します。

(継承元 BitmapSource)
IsDownloading

BitmapSource のコンテンツがダウンロード中かどうかを示す値を取得します。

(継承元 BitmapSource)
IsFrozen

オブジェクトが変更可能かどうかを示す値を取得します。

(継承元 Freezable)
IsSealed

このインスタンスが現在シールされている (読み取り専用である) かどうかを示す値を取得します。

(継承元 DependencyObject)
Metadata

このビットマップ イメージに関連付けられているメタデータを取得します。

(継承元 BitmapSource)
Palette

ビットマップのカラー パレットを取得します (カラー パレットが指定されている場合)。

(継承元 BitmapSource)
PixelHeight

ビットマップの高さ (ピクセル単位) を取得します。

(継承元 BitmapSource)
PixelWidth

ビットマップの幅 (ピクセル単位) を取得します。

(継承元 BitmapSource)
Width

デバイスに依存しない単位 (単位あたり 1/96 インチ) のビットマップの幅を取得します。

(継承元 BitmapSource)

メソッド

AddDirtyRect(Int32Rect)

変更されるビットマップの領域を指定します。

ApplyAnimationClock(DependencyProperty, AnimationClock)

AnimationClock を指定した DependencyProperty に適用します。 プロパティが既にアニメーション化されている場合は、SnapshotAndReplace ハンドオフ動作が使用されます。

(継承元 Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

AnimationClock を指定した DependencyProperty に適用します。 プロパティが既にアニメーション化されている場合は、指定した HandoffBehavior が使用されます。

(継承元 Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

指定された DependencyProperty にアニメーションを適用します。 アニメーションは、次のフレームがレンダリングされるときに開始されます。 指定されたプロパティが既にアニメーション化されている場合は、SnapshotAndReplace ハンドオフ動作が使用されます。

(継承元 Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

指定された DependencyProperty にアニメーションを適用します。 アニメーションは、次のフレームがレンダリングされるときに開始されます。 指定したプロパティが既にアニメーション化されている場合は、指定した HandoffBehavior が使用されます。

(継承元 Animatable)
CheckAccess()

呼び出し元のスレッドがこの DispatcherObject にアクセスできるかどうかを確認します。

(継承元 DispatcherObject)
CheckIfSiteOfOrigin()

ビットマップ ソース コンテンツが既知のサイトからのものかどうかを確認します。 このメソッドを使用して、ピクセルのコピー操作が安全であるか確認します。

(継承元 BitmapSource)
ClearValue(DependencyProperty)

プロパティのローカル値をクリアします。 クリアするプロパティは DependencyProperty 識別子で指定されます。

(継承元 DependencyObject)
ClearValue(DependencyPropertyKey)

読み取り専用プロパティのローカル値を消去します。 消去するプロパティは、DependencyPropertyKey で指定します。

(継承元 DependencyObject)
Clone()

この WriteableBitmap の変更可能な複製を作成し、このオブジェクトの値の詳細コピーを作成します。 このメソッドは、依存関係プロパティをコピーするときにリソース参照とデータ バインディングをコピーしますが (ただし、これらは解決されなくなる場合があります)、アニメーションやその現在の値はコピーしません。

CloneCore(Freezable)

このインスタンスを指定された BitmapSource の詳細なコピーにします。 このメソッドは、依存関係プロパティをコピーするときにリソース参照とデータ バインディングをコピーしますが (ただし、これらは解決されなくなる場合があります)、アニメーションやその現在の値はコピーしません。

(継承元 BitmapSource)
CloneCurrentValue()

この ByteAnimationUsingKeyFrames オブジェクトの変更可能な複製を作成し、このオブジェクトの現在値の詳細コピーを作成します。 リソース参照、データ バインディング、アニメーションはコピーされませんが、それらの現在値はコピーされます。

CloneCurrentValueCore(Freezable)

現在のプロパティ値を使用して、このインスタンスを、指定した BitmapSource の変更可能な詳細コピーにします。 リソース参照、データ バインディング、アニメーションはコピーされませんが、それらの現在値はコピーされます。

(継承元 BitmapSource)
CoerceValue(DependencyProperty)

指定した依存関係プロパティの値を強制します。 これは、呼び出し元の DependencyObject の依存関係プロパティのプロパティ メタデータで指定されている CoerceValueCallback 関数を呼び出すことによって実現されます。

(継承元 DependencyObject)
CopyPixels(Array, Int32, Int32)

指定したオフセットを開始位置として、ビットマップのピクセル データを、指定したストライドを持つピクセル配列にコピーします。

(継承元 BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

指定したオフセットを開始位置として、指定した四角形内にあるビットマップのピクセル データを、指定したストライドを持つピクセル配列にコピーします。

(継承元 BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

指定した四角形内にあるビットマップのピクセル データをコピーします。

(継承元 BitmapSource)
CreateInstance()

Freezable クラスの新しいインスタンスを初期化します。

(継承元 Freezable)
CreateInstanceCore()

派生クラスで実装された場合、Freezable 派生クラスの新しいインスタンスを作成します。

(継承元 Freezable)
Equals(Object)

指定した DependencyObject が現在の DependencyObject と等しいかどうかを判断します。

(継承元 DependencyObject)
Freeze()

現在のオブジェクトを変更不可能にし、その IsFrozen プロパティを true に設定します。

(継承元 Freezable)
FreezeCore(Boolean)

BitmapSource のインスタンスまたは派生クラスを不変にします。

(継承元 BitmapSource)
GetAnimationBaseValue(DependencyProperty)

指定した DependencyProperty のアニメーション化されていない値を返します。

(継承元 Animatable)
GetAsFrozen()

基本プロパティ値 (アニメーション化されていない値) を使用して、Freezable の 固定されたコピーを作成します。 コピーが固定されているため、参照によって任意の固定されたサブオブジェクトがコピーされます。

(継承元 Freezable)
GetAsFrozenCore(Freezable)

このインスタンスを、指定した BitmapSource オブジェクトの複製にします。

(継承元 BitmapSource)
GetCurrentValueAsFrozen()

現在のプロパティ値を使用して、Freezable の固定されたコピーを作成します。 コピーが固定されているため、参照によって任意の固定されたサブオブジェクトがコピーされます。

(継承元 Freezable)
GetCurrentValueAsFrozenCore(Freezable)

このインスタンスを、指定された BitmapSource の凍結された複製にします。 リソース参照、データ バインディング、アニメーションはコピーされませんが、それらの現在値はコピーされます。

(継承元 BitmapSource)
GetHashCode()

この DependencyObject のハッシュ コードを取得します。

(継承元 DependencyObject)
GetLocalValueEnumerator()

どの依存関係プロパティがこの DependencyObject 上にローカルに設定された値を持つかを確認するための、専用の列挙子を作成します。

(継承元 DependencyObject)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
GetValue(DependencyProperty)

DependencyObject のこのインスタンスにある依存関係プロパティの現在の有効値を返します。

(継承元 DependencyObject)
InvalidateProperty(DependencyProperty)

指定した依存関係プロパティの有効値を再評価します。

(継承元 DependencyObject)
Lock()

更新のためにバック バッファーを予約します。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
OnChanged()

現在の Freezable オブジェクトの変更時に呼び出されます。

(継承元 Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

設定されたばかりの DependencyObjectType データ メンバーに対して、適切なコンテキスト ポインターが確立されていることを確認します。

(継承元 Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

このメンバーは、Windows Presentation Foundation (WPF) インフラストラクチャをサポートしており、コードから直接使用することを意図したものではありません。

(継承元 Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

OnPropertyChanged(DependencyPropertyChangedEventArgs)DependencyObject 実装をオーバーライドして、さらに型 Freezable の変化する依存関係プロパティへの応答として任意の Changed ハンドラーも呼び出します。

(継承元 Freezable)
ReadLocalValue(DependencyProperty)

ローカルの依存関係プロパティの値を返します (存在する場合)。

(継承元 DependencyObject)
ReadPreamble()

Freezable が有効なスレッドからアクセスされていることを確認します。 Freezable の継承側は、依存関係プロパティでないデータ メンバーを読み取る任意の API の開始時に、このメソッドを呼び出す必要があります。

(継承元 Freezable)
SetCurrentValue(DependencyProperty, Object)

依存関係プロパティ値のソースを変更せずにその値を設定します。

(継承元 DependencyObject)
SetValue(DependencyProperty, Object)

依存関係プロパティ識別子を指定して、該当する依存関係プロパティのローカル値を設定します。

(継承元 DependencyObject)
SetValue(DependencyPropertyKey, Object)

依存関係プロパティの DependencyPropertyKey 識別子で指定した読み取り専用の依存関係プロパティのローカル値を設定します。

(継承元 DependencyObject)
ShouldSerializeProperty(DependencyProperty)

シリアル化プロセスが、指定された依存関係プロパティの値をシリアル化する必要があるかどうかを示す値を返します。

(継承元 DependencyObject)
ToString()

現在のカルチャに基づいて、このオブジェクトの文字列形式を作成します。

(継承元 ImageSource)
ToString(IFormatProvider)

渡された IFormatProvider に基づいて、このオブジェクトの文字列形式を作成します。 プロバイダーが null の場合は、CurrentCulture が使用されます。

(継承元 ImageSource)
TryLock(Duration)

ビットマップのロックを試行し、指定された時間内のみ待機します。

Unlock()

バック バッファーを解放して、表示に利用できるようにします。

VerifyAccess()

呼び出し元のスレッドがこの DispatcherObject にアクセスできるように強制します。

(継承元 DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

ビットマップの指定した領域内のピクセルを更新します。

WritePixels(Int32Rect, Array, Int32, Int32, Int32)

ビットマップの指定した領域内のピクセルを更新します。

WritePixels(Int32Rect, IntPtr, Int32, Int32)

ビットマップの指定した領域内のピクセルを更新します。

WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32)

ビットマップの指定した領域内のピクセルを更新します。

WritePostscript()

FreezableChanged イベントを発生させ、その OnChanged() メソッドを呼び出します。 Freezable から派生するクラスは、依存関係プロパティとして格納されていないクラス メンバーを変更するすべての API の終了時に、このメソッドを呼び出す必要があります。

(継承元 Freezable)
WritePreamble()

Freezable が固定されておらず、有効なスレッド コンテキストからアクセスされていることを確認します。 Freezable の継承側は、依存関係プロパティでないデータ メンバーに書き込む任意の API の開始時に、このメソッドを呼び出す必要があります。

(継承元 Freezable)

イベント

Changed

Freezable、またはこれに含まれているオブジェクトが変更されると発生します。

(継承元 Freezable)
DecodeFailed

イメージ ヘッダーの破損が原因で、イメージの読み込みが失敗したときに発生します。

(継承元 BitmapSource)
DownloadCompleted

ビットマップ コンテンツのダウンロードが完了したときに発生します。

(継承元 BitmapSource)
DownloadFailed

ビットマップ コンテンツのダウンロードが失敗したときに発生します。

(継承元 BitmapSource)
DownloadProgress

ビットマップ コンテンツのダウンロード状況が変化したときに発生します。

(継承元 BitmapSource)

明示的なインターフェイスの実装

IFormattable.ToString(String, IFormatProvider)

指定された書式を使用して現在のインスタンスの値を書式設定します。

(継承元 ImageSource)

適用対象

こちらもご覧ください