Получение свойства BitmapImage PixelHeight вызывает проблемы с инициализацией

У меня есть BitmapImage, для которого я хочу получить свойства PixelHeight и PixelWidth, чтобы определить, имеет ли он альбомную или портретную ориентацию. После того, как я определил его макет, мне нужно установить высоту или ширину изображения, чтобы оно поместилось в моем окне просмотра изображений, не искажая соотношение высоты и ширины. Однако, похоже, мне нужно вызвать BeginInit(), чтобы что-то сделать с моим изображением. Мне нужно вызвать EndInit(), чтобы получить свойства PixelHeight или PixelWidth, и я не могу вызывать BeginInit() более одного раза для одного и того же объекта BitmapImage. Итак, как я могу установить свое изображение, получить высоту и ширину, определить его ориентацию, а затем изменить размер изображения?

Вот кусок кода, с которым я работал:

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

Когда я запускаю это, я получаю это исключение времени выполнения:

ИнвалидОператионИсключение:

Инициализация BitmapImage не завершена. Вызовите метод EndInit, чтобы завершить инициализацию.

Кто-нибудь знает, как справиться с этой проблемой?


person kformeck    schedule 15.02.2013    source источник
comment
Зачем вообще нужно устанавливать DecodePixelWidth или DecodePixelHeight? Разве вы не можете просто поместить изображение в элемент управления Image с подходящим размером?   -  person Clemens    schedule 15.02.2013
comment
Кажется, что было бы проще просто загрузить изображение в его исходных размерах, а затем использовать ScaleTransform позже для достижения желаемого эффекта.   -  person Dana Cartwright    schedule 15.02.2013
comment
@Clemens: Если я не установлю свойство DecodePixel(Height/Width)(y/ies), мое изображение будет иметь нормальный размер и не будет правильно вписываться в панель. Мое изображение будет либо 1216x1616, либо 1616x1216 в зависимости от изображения. Мне нужно, чтобы максимальная длина любой стороны была не более 475 пикселей.   -  person kformeck    schedule 15.02.2013
comment
Элемент управления Image автоматически масштабирует растровое изображение в соответствии с его Растянуть свойство.   -  person Clemens    schedule 15.02.2013


Ответы (1)


Насколько я знаю, то, что вы хотите сделать, невозможно без двойного декодирования растрового изображения.

Я предполагаю, что было бы намного проще просто декодировать растровое изображение до его исходного размера, а затем установить размер содержащего его элемента управления Image по мере необходимости. Растровое изображение масштабируется соответствующим образом, как Stretch установлено значение Uniform (поскольку и ширина, и высота элемента управления Image установлены, Stretch также может быть установлено на Fill или UniformToFill).

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;
person Clemens    schedule 15.02.2013