获得Controls.Image宽度和高度

时间:2011-01-03 02:56:08

标签: .net wpf image-processing bitmap

我是WPF的新手,我正在尝试使用Controls.Image。当表单扩展时,我将它设置为拉伸。我试图在运行时生成Drawing.Bitmap以显示在WPF中的Controls.Image。当我生成Drawing.Bitmap时,我只想创建一个与屏幕上的Image控件一样大的(不要浪费cpu周期)。要创建图像,我有以下代码。 Bitmap bImage = new Bitmap((int)imgInput.Width, (int)imgInput.Height); imgInput是Controls.Image,bImage显然是Drawing.Bitmap。但是imgInput.Width和Height在运行时显示为0,尽管它们绝对不是在设计时。如果我不尝试动态拉伸图像以使用窗口展开,则没有按预期显示的问题。那么我该如何实际获得图像呢。还有人比在内存中创建Drawing.Bitmap并将其转换为WPF的ImageSource有更好的方法吗?我没有从URI或类似的东西加载图像,我必须在内存中创建它。

我通过以下代码绑定图像

            imgInput.Source = loadBitmap(bImage);

    }
    [DllImport("gdi32")]
    static extern int DeleteObject(IntPtr o);

    public static BitmapSource loadBitmap(System.Drawing.Bitmap source)
    {
        BitmapSource bs = null;
        IntPtr ip = source.GetHbitmap();
        try
        {
            bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip,
               IntPtr.Zero, Int32Rect.Empty,
               System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
        }
        finally
        {
            DeleteObject(ip);
        }

        return bs;
    }

2 个答案:

答案 0 :(得分:3)

从位图创建图像看起来不错。

XAML图像将根据位图本身的宽度/高度以及“可用”空间来重新调整大小。 WPF使用双通道布局系统 - 在第一轮中,每个控件被询问它需要多少空间,在第二轮中每个控件被分配一个宽度/高度。

在结合的位图,如果没有你的图像控制的祖先有一个固定/最大宽度无法检索图像的高度,仅仅是因为没有设置呢。

的一种方法将被设定基于通过结合一个祖先的图像的宽度/高度,再次,这将需要在容器上的一些组的宽度/高度。

网格容器的示例:

<Image Source="sample.png" 
        Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}},Path=ActualWidth}" 
        Height="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid}},Path=ActualHeight}" />

另外要仔细选择你的容器 - 一个StackPanel,即总是与它的孩子成长(垂直如果方向是水平的,反之亦然),除非你指定一个固定的或最大宽度/高度。其他容器的行为也不同,即UniformGrid会使所有子容器的大小相等。我会尝试一个只有一行的Grid。

答案 1 :(得分:0)

要获取Height的{​​{1}}和Width,您需要将代码更改为

Source

Bitmap bImage = new Bitmap((int)imgInput.Source.Width, (int)imgInput.Source.Height); imgInput.Width给出控件的高度和宽度,

imgInput.HeightimgInput.Source.Width给出了来源的高度和宽度