获取BitmapImage PixelHeight属性会导致初始化问题

时间:2013-02-15 17:02:53

标签: c# .net wpf graphics imaging

我有一个BitmapImage,我想获得PixelHeight和PixelWidth属性,以便我可以确定它是否具有横向或纵向布局。确定其布局后,我需要设置图像的高度或宽度,使其适合我的图像查看器窗口,而不会扭曲高度:宽度比。但是,看来我必须调用BeginInit()才能对我的图像做任何事情。我必须调用EndInit()来获取PixelHeight或PixelWidth属性,并且我不能在同一个BitmapImage对象上多次调用BeginInit()。那么我怎样才能设置我的图像,获取高度和宽度,确定其方向然后调整图像大小?

这里是我一直在使用的代码块:

image.BeginInit();
Uri imagePath = new Uri(path + "\\" + die.Die.ImageID + "_" + blueTape + "_BF.BMP");
image.UriSource = imagePath;
//image.EndInit();
imageHeight = image.PixelHeight;
imageWidth = image.PixelWidth;
//image.BeginInit();
// If the image is taller than it is wide, limit the height of the image
// i.e. DML87s and all non-rotated AOI devices
if (imageHeight > imageWidth)
{
    image.DecodePixelHeight = 357;
}
else
{
    image.DecodePixelWidth = 475;
}
image.EndInit();

当我运行它时,我得到了这个运行时异常:

  

InvalidOperationException异常:

     

BitmapImage初始化未完成。调用EndInit方法   完成初始化。

有人知道如何处理这个问题吗?

1 个答案:

答案 0 :(得分:2)

据我所知,如果不对位图进行两次解码,你不可能做什么。

我想将位图解码为其原始大小然后根据需要设置包含的Image控件的大小会简单得多。由于Stretch设置为Uniform,因此位图会相应缩放(因为设置了图像控件的宽度和高度,Stretch也可以设置为FillUniformToFill)。

var bitmap = new BitmapImage(new Uri(...));

if (bitmap.Width > bitmap.Height)
{
    image.Width = 475;
    image.Height = image.Width * bitmap.Height / bitmap.Width;
}
else
{
    image.Height = 475;
    image.Width = image.Height * bitmap.Width / bitmap.Height;
}

image.Stretch = Stretch.Uniform;
image.Source = bitmap;