2016-06-24 8 views
6

Ich habe Bitmap aus einer Liste von RGBA Pixel erstellt:Bildskalierung und es bei 0,0 in WPF Positionierung

// 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:

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

ich ein Bild aus dem Bitmap dann erstellen dann fügen sie das Bild auf die Leinwand:

   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); 

Das Problem ist, dass es nicht zu imageScaleWidth und imageScaleHeight skaliert bekommen, und es wird in der Mitte der Leinwand angezeigt.

Hinweis, konnte ich dies in Java SWT tun:

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

Abgesehen davon ist 'imageStrideInPixels' ein ziemlich seltsamer Name für die Breite einer Bitmap, sind Sie sicher, dass die Verhältnisse' imageStrideInPixels/imageScaleWidth' und 'height/imageScaleHeight' gleich sind? Ansonsten sollte das Bild nicht nur skaliert, sondern auch gestreckt werden. Sie müssen dann 'BmpImg.Stretch = Stretch.Fill;' einstellen. – Clemens

+0

Brauchst du die Leinwand eigentlich für irgendwas? –

+1

komisch, wie dein _java_-Tag mich daran hindert, das zu sehen, ich frage mich, wie viele Leute du dadurch ausschließt ... –

Antwort

0

Sind Sie sicher, dass das Bild auf halben Weg wird die Leinwand nach unten und nicht die Leinwand selbst in seiner Mutter zentriert? Ich habe es getestet und es scheint, dass Sie die Canvas-Position steuern können, indem Sie die vertikale/horizontale Ausrichtung auf dem Canvas-Parent festlegen. Außerdem skaliert es richtig, wenn Sie den bereitgestellten Code verwenden. Allerdings habe ich eine BitmapSource auf andere Weise erstellt. Ich habe den folgenden Code:

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

Anstatt diese

  mycanvas.Children.Add(BmpImg); 

Versuchen Sie, diese

 mycanvas.Background = new VisualBrush(BmpImg); 

richtig machen dies sollte.

// 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); 

Beachten Sie, dass Ihr Bild bei 0 versetzt angeordnet werden, standardmäßig 0:

3

Sie können Ihr Bild mit einem ScaleTransform skalieren.