私は画像にフィルタを適用するWindows 8 Metroアプリケーションで作業しています。私はアプリのウェブ版を持っていて、それを移植したかった。しかし、われわれ全員が知っているように、WinRTには.NETが提供するすばらしいものはありません。/C#Windows 8 Store(Metro、WinRT)BitmapImageへのバイト配列
現在、私はバイト配列にフィルタを適用しています。だから過去数日間私はStorageFileをbyte []に変換し、次にbyte []をBitmapImageに変換する方法を探してきました。
これまでのところ、私は最初のファイルを管理しています(StorageFile to byte [])。ここで私はそれを行う方法です。
public async Task<Byte[]> ImageFileToByteArray(StorageFile file)
{
IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
return pixelData.DetachPixelData();
}
コードのこの作品はBGRAような画素データが含まれているbyte[]
を返します。
ここではトリッキーな部分があります。私は正常にバイト配列をBitmapImageに変換できません。私は場所を探し回っており、多くの人がWriteableBitmapの使用を提案していますが、それは私にはあまり役に立ちません。私は、動作するはずのコードをいくつか見つけましたが、そうではありません。私はこのようなInMemoryRandomAccessStreamを使用しているしようとしたソリューションの
一つは:
はタイプの例外「のSystem.Exception」をmscorlibで発生しました:
public async Task<BitmapImage> ByteArrayToBitmapImage(Byte[] pixels) { var stream = new InMemoryRandomAccessStream(); await stream.WriteAsync(pixels.AsBuffer()); stream.Seek(0); var image = new BitmapImage(); await image.SetSourceAsync(stream); return image; }
この1つは、次の例外がスローされます。 dllがユーザーコードで処理されませんでした
追加情報:コンポーネントが見つかりません。 (HRESULTからの例外:0x88982F50)
私の代わりにこのラインを使用してみました:
PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
new BitmapTransform(),
ExifOrientationMode.IgnoreExifOrientation,
ColorManagementMode.DoNotColorManage);
しかし、私はその例外を取得しておくので、それは私には良いもしませんでした。
また、私はこれを試してみました:
var bitmapImage = new BitmapImage();
var pixels = await ImageFileToByteArray(file);
ImageSource imgSource;
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream())
{
using (DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0)))
{
writer.WriteBytes(pixels);
await writer.StoreAsync();
}
await bitmapImage.SetSourceAsync(ms);
imgSource = bitmapImage;
}
とコードの最初の部分と同じ例外を取得します。
また、通常のストリームを使用してIRandomAccessStreamに変換するなどいくつかの方法を試しましたが、どちらも機能しませんでした。
上記のコードはすべて私にとってうまくいくようです。だから今私の推測では、問題はbyte[]
にあるということです。私は内部のpixelDataのフォーマットが有効ではないと推測していますので、RGBAに変更しようとしましたが、どちらも役に立ちませんでした。またPixelHeightとのBitmapImageのPixelWidthは0
解決策が見つかりましたか?私も同じ問題を抱えています。 – TheQuestioner