SilverlightでBitmapImageを変更しようとしていますが、たまたま「壊滅的な障害」が発生しました。
まず、画像を読み込んでLayoutRootに追加します。
BitmapImage source = new BitmapImage(new Uri("image.jpg", UriKind.Relative));
Image imageElement = new Image();
imageElement.Name = "imageElement";
imageElement.Source = source;
imageElement.Stretch = Stretch.None;
LayoutRoot.Children.Add(imageElement);
これは正常に機能し、画像は画面に正しく表示されます。
次に、画像を変更します(たとえば、ボタンをクリックした後)。
ボタンクリックメソッドでは、最初にLayoutRootから画像を取得し、次にWriteableBitmapクラスを使用して画像を変更します。
Image imageElement = (Image) LayoutRoot.Children[1];
WriteableBitmap writeableBitmap = new WriteableBitmap(imageElement, null);
writeableBitmap.ForEach((x,y,color) => Color.FromArgb((byte)(color.A / 2), color.R, color.G, color.B));
次に、指定された方法を使用してバイト配列バッファーに保存します。
byte[] buffer = writeableBitmap.ToByteArray();
これもよさそうだ。バッファにはすべてのARGB値が表示され、アルファ値でさえ通常の値の半分である127です。
次のステップでは、変更したデータをBitmapImageにロードし、最後にImageにロードして、LayoutRootに再度追加します。
BitmapImage modifiedSource = null;
try
{
using (MemoryStream stream = new MemoryStream(buffer))
{
stream.Seek(0, SeekOrigin.Begin);
BitmapImage b = new BitmapImage();
b.SetSource(stream);
modifiedSource = b;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
私はここでこのコードピースを見つけました:byte[]からBitmapImageへのsilverlight
最後のステップとして、イメージを再度作成し、それをLayoutRootに追加します(最初に行ったのと同じように:
Image modifiedImageElement = new Image();
modifiedImageElement.Name = "newImageElement";
modifiedImageElement.Source = modifiedSource;
modifiedImageElement.Stretch = Stretch.None;
LayoutRoot.Children.Add(modifiedImageElement);
しかし、「壊滅的な障害」が発生するため、最後の部分に到達することはありません。
b.SetSource(stream);
行、言って:
{System.Exception: Catastrophic failure (Ausnahme von HRESULT: 0x8000FFFF (E_UNEXPECTED))
at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
at MS.Internal.XcpImports.BitmapSource_SetSource(BitmapSource bitmapSource, CValue& byteStream)
at System.Windows.Media.Imaging.BitmapSource.SetSourceInternal(Stream streamSource)
at System.Windows.Media.Imaging.BitmapImage.SetSourceInternal(Stream streamSource)
at System.Windows.Media.Imaging.BitmapSource.SetSource(Stream streamSource)
at SilverlightApplication1.MainPage.button1_Click(Object sender, RoutedEventArgs e)}
何が悪かったのかわかりません。ここでSilverlightの記事を見つけました :ストリームからのBitmapImageが例外をスローします(壊滅的な失敗(HRESULTからの例外:0x8000FFFF(E_UNEXPECTED)))、これはたまたま同じ例外がありますが、私が読んだところ、彼はこの問題を抱えているのは彼はたくさんの画像をアップロードしていました、そしてそれは彼にとって少量の画像のためにうまくいきました。それで、私はまだこの問題を解決する方法について無知ですか?
何かアドバイスはありますか?ありがとう!