2016-06-24 59 views
6

ho creato BitmapSource da un elenco di pixel RGBA:Scala di un'immagine e posizionandolo a 0,0 in WPF

BitmapSource bmp = BitmapSource.Create(imageStrideInPixels, height, 96, 96, PixelFormats.Bgra32, null, imageData, imageStrideInPixels * pixelWidth); 

Ho quindi creare un'immagine dal BitmapSource:

// create image and set image as source 
    Image BmpImg = new Image(); 
    BmpImg.SetValue(Canvas.ZIndexProperty, 0); 
    BmpImg.Width = imageScaleWidth; 
    BmpImg.Height = imageScaleHeight; 
    BmpImg.Source = bmp; 

I quindi aggiungere l'immagine sulla tela:

   mycanvas.Width = imageScaleWidth; 
       mycanvas.Height = imageScaleHeight; 
       mycanvas.Children.Clear(); 
       mycanvas.Children.Add(BmpImg); 
       Canvas.SetLeft(BmpImg, 0); // to set position (x,y) 
       Canvas.SetTop(BmpImg, 0); 

il problema è che non è sempre scalata a imageScaleWidth e imageScaleHeight, e viene visualizzato a metà della tela.

nota, sono stato in grado di fare questo in Java SWT da:

imageData = imageData.scaledTo(imageScaleWidth, imageScaleHeight); 
gc.drawImage(imageData, 0, 0); 
+1

Oltre che 'imageStrideInPixels' è un nome piuttosto strano per la larghezza di una bitmap, sei sicuro che le proporzioni' imageStrideInPixels/imageScaleWidth' e 'height/imageScaleHeight' sono uguali? Altrimenti l'immagine non dovrebbe essere ridimensionata, ma anche allungata. Potrebbe quindi essere necessario impostare 'BmpImg.Stretch = Stretch.Fill;'. – Clemens

+0

Hai davvero bisogno della tela per qualcosa? –

+1

divertente come il tuo tag _java_ mi ha impedito di vederlo, mi chiedo quante persone in più stai escludendo da questo ... –

risposta

0

Sei sicuro che l'immagine è a metà strada verso il basso la tela e non la tela stessa è centrata nel suo genitore? L'ho provato e sembra che tu possa controllare la posizione della tela impostando l'allineamento verticale/orizzontale sul genitore della tela. E inoltre si adatta correttamente quando si utilizza il codice che hai fornito. Tuttavia ho creato una BitmapSource in un modo diverso. Ho usato il seguente codice:

PngBitmapDecoder decoder = new PngBitmapDecoder(new Uri(@"..."), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
BitmapSource bmp = decoder.Frames[0]; 
1

Invece di questo

  mycanvas.Children.Add(BmpImg); 

Prova questo

 mycanvas.Background = new VisualBrush(BmpImg); 

Questo dovrebbe rendere correttamente.

3

È possibile scalare l'immagine utilizzando un ScaleTransform:

// scale the original bitmap source 
var transformedBitmap = new TransformedBitmap(
    bmp, 
    new ScaleTransform(
     imageScaleWidth/(double) bmp.PixelWidth, 
     imageScaleHeight/(double) bmp.PixelHeight)); 

// create image and set image as source 
Image bmpImg = new Image(); 
bmpImg.SetValue(Canvas.ZIndexProperty, 0); 
bmpImg.Source = transformedBitmap; 

mycanvas.Width = imageScaleWidth; 
mycanvas.Height = imageScaleHeight; 
mycanvas.Children.Clear(); 
mycanvas.Children.Add(bmpImg); 

Nota che l'immagine sarà posizionata all'offset 0, 0 per impostazione predefinita.