2

winrt (win 8 Metro) 用の WriteableBitmapEx をダウンロードしました。拡張メソッドを使用して dll への参照を追加し、それらをコードで使用しました。すべてが正常にコンパイルされます。

問題は、拡張メソッドが効果がないことです。ここに私のコードの一部があります:

WriteableBitmap wb = new WriteableBitmap((int)pictureSize.Width,   (int)pictureSize.Height);
wb.SetSource(fileStream);
var newWB = wb.Flip(FlipMode.Vertical);
ImageControl.Source = newWB;     
newWB.Invalidate(); 

画像が画面に表示されません。しかし、画像に線などを描画しようとすると、画像は画面に変更されずに表示されます。

ありがとう!

4

1 に答える 1

2

wb.Flip を使用すると、画像が完全に読み込まれなかったと思います。IIRC wb.SetSource は非同期で実行されます。

FromContent と呼ばれる WriteableBitmapEx ライブラリで使用できる別のメソッドがあります。これにより、アプリのコンテンツから画像を読み込むことができ、メソッドはバックグラウンドですべてを処理します。

以下のスニペットは、logo.png をロードして反転し、WriteableBitmap をイメージ コントロールに割り当てます。

var wb = await BitmapFactory.New(1, 1).FromContent(new Uri(BaseUri, @"///assets/logo.png"));
wb = wb.Flip(WriteableBitmapExtensions.FlipMode.Vertical);
Viewport.Source = wb;  

WinRT バージョンの WriteableBitmapEx.FromContent メソッドのソース コードを調べると、ストリームがどのように WriteableBitmap に変換されるかがわかります。以下のスニペットを使用して、任意の画像形式 IRandomAccessStream を WriteableBitmap にデコードします。

// Decode image format
var decoder = await BitmapDecoder.CreateAsync(fileStream);
var transform = new BitmapTransform();
var pixelData = await decoder.GetPixelDataAsync(decoder.BitmapPixelFormat, decoder.BitmapAlphaMode, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);

// Swap R and B channels since it's reversed
var pixels = pixelData.DetachPixelData();
for (var i = 0; i < pixels.Length; i += 4)
{
    var r = pixels[i];
    var b = pixels[i + 2];
    pixels[i] = b;
    pixels[i + 2] = r;
}

// Copy pixels to WriteableBitmap
var wb = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
using (var bmpStream = wb.PixelBuffer.AsStream())
{
    bmpStream.Seek(0, SeekOrigin.Begin);
    bmpStream.Write(pixels, 0, (int)bmpStream.Length);
}


// Your original code
var newWB = wb.Flip(FlipMode.Vertical);
ImageControl.Source = newWB; 

はい、それは例外よりもはるかに多くのコードです。以前に Silverlight または WPF でこれを行った場合。

于 2012-06-12T18:44:49.057 に答える