2009-09-28 20 views
7

Temel olarak, bir bitmap'e piksel yazabileceğim ve WPF aracılığıyla bu bitmap'i güncelleyip görüntüleyebileceğim WPF'de GDI türü işlevsellik istiyorum. Not, fare hareketlerine yanıt olarak pikselleri güncelleyerek uçtaki bitmap'i canlandırabilmem gerekir. InteropBitmap'ın bunun için mükemmel olduğunu okudum, çünkü hafızada piksellere yazabiliyor ve hafıza yerini bitmap'e kopyalayabiliyordum - ama benim için iyi bir örnek yok.wpf 2d yüksek performanslı grafikler

WPF'de yüksek performanslı 2D grafikler oluşturmak için InteropBitmap veya diğer bazı sınıfları kullanmak için herhangi bir iyi kaynak, eğitici veya blog bilen var mı?

+0

Pixel-pixel şeyler yapıyorsanız, WPF'ye gerçekten ihtiyacınız var mı? – MusiGenesis

+0

Uygulamanın geri kalanının içeriği WPF'dir. – Klay

cevap

4

İşte ne buldum var:

Ben Image alt sınıfların bir sınıf yarattı.

public class MyImage : Image { 
    // the pixel format for the image. This one is blue-green-red-alpha 32bit format 
    private static PixelFormat PIXEL_FORMAT = PixelFormats.Bgra32; 
    // the bitmap used as a pixel source for the image 
    WriteableBitmap bitmap; 
    // the clipping bounds of the bitmap 
    Int32Rect bitmapRect; 
    // the pixel array. unsigned ints are 32 bits 
    uint[] pixels; 
    // the width of the bitmap. sort of. 
    int stride; 

public MyImage(int width, int height) { 
    // set the image width 
    this.Width = width; 
    // set the image height 
    this.Height = height; 
    // define the clipping bounds 
    bitmapRect = new Int32Rect(0, 0, width, height); 
    // define the WriteableBitmap 
    bitmap = new WriteableBitmap(width, height, 96, 96, PIXEL_FORMAT, null); 
    // define the stride 
    stride = (width * PIXEL_FORMAT.BitsPerPixel + 7)/8; 
    // allocate our pixel array 
    pixels = new uint[width * height]; 
    // set the image source to be the bitmap 
    this.Source = bitmap; 
} 

WriteableBitmap piksel verileri olarak işaretsiz ints dizisini alır WritePixels adlı bir yöntem vardır. Görüntünün kaynağını WriteableBitmap olarak ayarladım. Şimdi, piksel verilerini güncellediğimde ve WritePixels'i aradığımda, görüntüyü günceller.

İş noktası verilerini ayrı bir nesnede bir Nokta Listesi olarak saklıyorum. Listede dönüşümler yapıyorum ve piksel verilerini dönüştürülmüş noktalarla güncelliyorum. Bu şekilde Geometri nesnelerinden hiçbir yük yoktur.

Sadece FYI, noktalarımı Bresenham'ın algoritması adlı bir şeye çizilen çizgilerle birleştiriyorum. Bu yöntem hızlıdır. Fare hareketlerine tepki olarak yaklaşık 50.000 puan (ve bağlantı çizgileri) güncelleştiriyorum, fark edilebilir bir gecikme yok.

1

Web cameras with InteropBitmap'u kullanarak bir blog yazısı var. InteropBitmap'in kullanımını gösteren tam bir kaynak kod projesi içerir.

+0

Bu alıntıyı blogdan seviyorum: "... Görüntülemede WPF performansı berbattır". – MusiGenesis

İlgili konular