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 두 개의 버퍼를 사용합니다. 백 버퍼는 시스템 메모리에 할당되며 현재 표시되지 않는 콘텐츠를 누적합니다. 프런트 버퍼는 시스템 메모리에 할당되며 현재 표시되는 콘텐츠를 포함합니다. 렌더링 시스템은 디스플레이를 위해 전면 버퍼를 비디오 메모리에 복사합니다.

두 스레드는 이러한 버퍼를 사용합니다. UI(사용자 인터페이스) 스레드는 UI를 생성하지만 화면에는 표시되지 않습니다. UI 스레드는 사용자 입력, 타이머 및 기타 이벤트에 응답합니다. 애플리케이션이 여러 UI 스레드를 가질 수 있습니다. 렌더링 스레드는 UI 스레드의 변경 내용을 작성하고 렌더링합니다. 애플리케이션당 하나만 렌더링 스레드에 있습니다.

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

단일 행 픽셀 데이터의 바이트 수를 나타내는 값을 가져옵니다.

CanFreeze

개체를 수정 불가능으로 설정할 수 있는지 여부를 나타내는 값을 가져옵니다.

(다음에서 상속됨 Freezable)
DependencyObjectType

DependencyObjectType 이 instance CLR 형식을 래핑하는 을 가져옵니다.

(다음에서 상속됨 DependencyObject)
Dispatcher

Dispatcher와 연결된 DispatcherObject를 가져옵니다.

(다음에서 상속됨 DispatcherObject)
DpiX

이미지의 인치당 가로 점(dpi)을 가져옵니다.

(다음에서 상속됨 BitmapSource)
DpiY

이미지의 인치당 세로 점(dpi)을 가져옵니다.

(다음에서 상속됨 BitmapSource)
Format

비트맵 데이터의 네이티브 PixelFormat을 가져옵니다.

(다음에서 상속됨 BitmapSource)
HasAnimatedProperties

하나 이상의 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)

지정된 DependencyPropertyAnimationClock을 적용합니다. 속성에 이미 애니메이션 효과가 적용되어 있으면 SnapshotAndReplace 전달 동작이 사용됩니다.

(다음에서 상속됨 Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

지정된 DependencyPropertyAnimationClock을 적용합니다. 속성에 이미 애니메이션이 적용되어 있으면 지정된 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)

이 멤버는 WPF(Windows Presentation Foundation) 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

(다음에서 상속됨 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)

serialization 프로세스에서 지정된 종속성 속성의 값을 직렬화해야 하는지 여부를 나타내는 값을 반환합니다.

(다음에서 상속됨 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()

Changed 에 대한 Freezable 이벤트를 발생시키고 해당 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)

적용 대상

추가 정보