WriteableBitmap 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
쓰고 업데이트할 수 있는 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
예제
다음 예제에서는 사용 하는 방법을 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 하나를 호출하여 백 버퍼의 콘텐츠를 자동으로 업데이트하고 표시합니다.
업데이트를 보다 세분화하고 백 버퍼에 대한 다중 스레드 액세스의 경우 다음 워크플로를 사용합니다.
메서드를 Lock 호출하여 업데이트를 위해 백 버퍼를 예약합니다.
속성에 액세스하여 백 버퍼에 대한 포인터를 BackBuffer 가져옵니다.
백 버퍼에 변경 내용을 씁니다. 다른 스레드는 가 잠겨 있을 때 WriteableBitmap 백 버퍼에 변경 내용을 쓸 수 있습니다.
메서드를 AddDirtyRect 호출하여 변경된 영역을 나타냅니다.
메서드를 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) |
지정된 DependencyProperty에 AnimationClock을 적용합니다. 속성에 이미 애니메이션 효과가 적용되어 있으면 SnapshotAndReplace 전달 동작이 사용됩니다. (다음에서 상속됨 Animatable) |
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
지정된 DependencyProperty에 AnimationClock을 적용합니다. 속성에 이미 애니메이션이 적용되어 있으면 지정된 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 속성을 |
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를 기준으로 이 개체의 문자열 표현을 만듭니다. 공급자가 |
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) |
적용 대상
추가 정보
.NET