문제

은 거기를 얻을 수 있는 방법 DrawingContext (또는 이와 유사한)한 WriteableBitmap?I.e.무언가를 할 수 있도록 간단한 통화 DrawLine/DrawRectangle/등 종류의 방법보다 조작 원 픽셀이 직접 있습니다.

도움이 되었습니까?

해결책 4

이 단어가 없음.


향후 참조를 위해,우리가 사용하려트 쓰기가 가능한 비트맵 확장 WPF.

에 대한 솔루션을 사용하여 순수한 기존 코드,다른 아래에 언급된 제안은 일할 것이다.

다른 팁

내가 찾 sixlettervariables'솔루션을 가장 실행할 수 있는 하나입니다.그러나,"drawingContext.Close()"없습니다.에 따라 MSDN,"A DrawingContext 을 닫기 전에 그 내용을 렌더링할 수 있습니다".결과는 다음과 같은 유틸리티 기능:

public static BitmapSource CreateBitmap(
    int width, int height, double dpi, Action<DrawingContext> render)
{
    DrawingVisual drawingVisual = new DrawingVisual();
    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        render(drawingContext);
    }
    RenderTargetBitmap bitmap = new RenderTargetBitmap(
        width, height, dpi, dpi, PixelFormats.Default);
    bitmap.Render(drawingVisual);

    return bitmap;
}

이는 다음을 쉽게 같이 사용됩니다.

BitmapSource image = ImageTools.CreateBitmap(
    320, 240, 96,
    drawingContext =>
    {
        drawingContext.DrawRectangle(
            Brushes.Green, null, new Rect(50, 50, 200, 100));
        drawingContext.DrawLine(
            new Pen(Brushes.White, 2), new Point(0, 0), new Point(320, 240));
    });

지 않는 경우에 마을 사용하여 System.Drawing 당신이 할 수 있는 다음과 같습니다.

var wb = new WriteableBitmap( width, height, dpi, dpi, 
                              PixelFormats.Pbgra32, null );
wb.Lock();
var bmp = new System.Drawing.Bitmap( wb.PixelWidth, wb.PixelHeight,
                                     wb.BackBufferStride, 
                                     PixelFormat.Format32bppPArgb, 
                                     wb.BackBuffer );

Graphics g = System.Drawing.Graphics.FromImage( bmp ); // Good old Graphics

g.DrawLine( ... ); // etc...

// ...and finally:
g.Dispose(); 
bmp.Dispose();
wb.AddDirtyRect( ... );
wb.Unlock();                    

는지 궁금하네요 같은 것으로,현재 나는 다음과 같습니다.

DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
   //
   // ... draw on the drawingContext
   //
   RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Default);
   bmp.Render(drawingVisual);
   image.Source = bmp;
}

내가 사용하려고 WriteableBitmap 을 허용하는 다중 스레드 액세스를 픽셀이 버퍼는 현재 사용할 수 없도 DrawingContext 도 RenderTargetBitmap.어쩌면 어떤 종류의 WritePixels 일상적인 기반으로 하는 당신은에서 검색 RenderTargetBitmap 작동?

다른 방법으로 이 문제를 해결하기 위해 사용하는 것입 RenderTargetBitmap 백업으로 저장처럼에서 WriteableBitmap 예입니다.을 만들 수 있습니다 다음 문제가 WPF 그 명령을니다.예를 들어:

// create the backing store in a constructor
var backingStore = 
      new RenderTargetBitmap(200,200,97,97,PixelFormats.Pbgra32);
myImage.Source = backingStore;

// whenever you want to update the bitmap, do:
var drawingVisual = new DrawingVisual();
var drawingContext = drawingVisual.RenderOpen();
{
    // your drawing commands go here
    drawingContext.DrawRectangle(
            Brushes.Red, new Pen(),
            new Rect(this.RenderSize));
}
Render(drawingContext);
drawingContext.Close();
backingStore.Render(drawingVisual);

하려는 경우이 다시 그리기 RenderTargetBitmap 각 구조는,당신이 잡을 수 있습니다 CompositionTarget.Rendering 이벤트,다음과 같다:

CompositionTarget.Rendering += MyRenderingHandler;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top