1

PixelHeightプロパティとPixelWidthプロパティを取得したいBitmapImageがあるので、横向きと縦向きのどちらのレイアウトかを判断できます。レイアウトを決定したら、画像の高さまたは幅を設定して、高さ:幅の比率を歪めずに画像ビューアウィンドウに収まるようにする必要があります。ただし、画像を処理するには、BeginInit()を呼び出す必要があるようです。PixelHeightまたはPixelWidthプロパティを取得するにはEndInit()を呼び出す必要があり、同じ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メソッドを呼び出して、初期化を完了します。

誰かがこの問題に対処する方法を知っていますか?

4

1 に答える 1

2

私の知る限り、あなたがやりたいことは、ビットマップを 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;
于 2013-02-15T17:35:47.283 に答える