缩放图像并在WPF中将其定位为0,0

本文关键字:定位 图像 WPF 缩放 | 更新日期: 2023-09-27 17:49:01

我已经从RGBA像素列表中创建了BitMapSource:

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

然后从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;

然后将图像添加到画布:

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

问题是它没有缩放到imageScaleWidth和imageScaleHeight,它被显示在画布的一半。

注意,我可以在Java SWT中这样做:
imageData = imageData.scaledTo(imageScaleWidth, imageScaleHeight);
gc.drawImage(imageData, 0, 0); 

缩放图像并在WPF中将其定位为0,0

您可以使用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);

请注意,默认情况下,您的图像将定位在偏移量0,0处

代替

            mycanvas.Children.Add(BmpImg);

试试这个

       mycanvas.Background = new VisualBrush(BmpImg);

你确定图像是在画布的中间,而不是画布本身在其父元素的中心吗?我测试了它,它似乎可以控制画布的位置通过设置画布的父垂直/水平对齐。当使用您提供的代码时,它也可以适当缩放。然而,我用一种不同的方式创建了BitmapSource。我使用了以下代码:

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