2016-06-16 17 views
7

Aşağıdaki Java SWT kodunun WPF eşdeğeri nedir? RGBA değerleri listesinden bir Görüntü oluşturmak ve bir Tuvalde görüntülemek istiyorum.WPF eşdeğeri, Resim Sunucusu'nu kullanarak bir Görüntüyü bir Tuval üzerinde görüntülemenin ne kadar olduğunu Java SWT

private Image GetImage() 
{ 

    ImageData imageData = new ImageData(imageWidth, imageHeight,32,palette); 

    int pixelVecLoc=0; 
    for (int h = 0; h<imageHeight && (pixelVecLoc < currentImagePixelVec.size()); h++) 
    { 
     for (int w = 0; w<imageWidth && (pixelVecLoc < currentImagePixelVec.size()); w++) 
     { 
      int p = 0; 
      Pixel pixel = currentImagePixelVec.get(pixelVecLoc); 
      p = (pixel.Alpha<<24) | (pixel.Red<<16) | (pixel.Green<<8) | pixel.Blue;     
      imageData.setPixel(w, h, p);    
      pixelVecLoc++; 
     } 
    } 

    imageData = imageData.scaledTo(imageScaleWidth, imageScaleHeight); 
    Image image = ImageDescriptor.createFromImageData(imageData).createImage(); 
    return image; 
} 

Sonra bir tuval üzerinde çizin:

gc.drawImage(image, 0, 0); 
+2

bir resim denetimi kullanın ve bir 'WriteableBitmap' atamak onun 'Kaynak' özelliği. Ya da ham piksel verilerinden bir BitmapSource oluşturmak için 'BitmapSource.Create()' aşırı yüklerinden birini kullanın. – Clemens

cevap

6

Bu özel bir RGBA tampon oluşturmak ve bu piksel verilerini yazabilir gösteren kısa bir pasajı (based on this example) 'dir:

int width = 512; 
int height = 256; 
int stride = width * 4 + (width % 4); 
int pixelWidth = 4; // RGBA (BGRA) 
byte[] imageData = new byte[width * stride];  // raw byte buffer 

for (int y = 0; y < height; y++) 
{ 
    int yPos = y * stride; 

    for (int x = 0; x < width; x++) 
    { 
     int xPos = yPos + x * pixelWidth; 

     imageData[xPos + 2] = (byte) (RedValue); // replace *Value with source data 
     imageData[xPos + 1] = (byte) (GreenValue); 
     imageData[xPos ] = (byte) (BlueValue); 
     imageData[xPos + 3] = (byte) (AlphaValue); 
    } 
} 

Sonra PixelFormats birlikte BitmapSource.Create Method (Int32, Int32, Double, Double, PixelFormat, BitmapPalette, IntPtr, Int32, Int32) yöntemi kullanın:

BitmapSource bmp = 
    BitmapSource.Create(
    width, 
    height, 
    96,     // Horizontal DPI 
    96,     // Vertical DPI 
    PixelFormats.Bgra32, // 32-bit BGRA 
    null,     // no palette 
    imageData,    // byte buffer 
    imageData.Length,  // buffer size 
    stride);    // stride 

Bayt sırasının, pasajda gösterildiği gibi alfa bileşeni (BGRA) dışında ters olduğunu unutmayın.

Source olarak BitmapSource set, öncelikle bir Image oluşturabilir tuvale ve nihayet tuvale eklemek sonucunu aktarmak için:

// create image and set image as source 
Image BmpImg = New Image(); 
BmpImg.Width = width; 
BmpImg.Height = height; 
BmpImg.Source = bmp; 

// add image to canvas 
canvas.Children.Add(BmpImg); 

Canvas.SetLeft(BmpImg, 0); // to set position (x,y) 
Canvas.SetTop(BmpImg, 0); 
+1

Bunun için teşekkürler - bunu bir tuvalde nasıl gösterirdiniz? –

+1

@Robben_Ford_Fan_boy Bir örnek ekledim. Feragatname: VS şu an devrede, ben de kontrol edemedim. Ben hafızadan gidiyorum. (birileri), bir şeylerin yanlış olup olmadığını bildirirseniz, güncelleme yapacağım. – K3N

İlgili konular