Windows Phone7アプリケーションでBitmapImageをByteArrayに変換したいと思います。だから私はこれを試しましたが、ランタイム例外「無効なポインタ例外」がスローされます。私がやろうとしていることが例外をスローする理由を誰かが説明できますか?そして、これに対する代替ソリューションを提供できますか。
public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
{
byte[] data;
// Get an Image Stream
using (MemoryStream ms = new MemoryStream())
{
WriteableBitmap btmMap = new WriteableBitmap(bitmapImage);
// write an image into the stream
Extensions.SaveJpeg(btmMap, ms,
bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);
// reset the stream pointer to the beginning
ms.Seek(0, 0);
//read the stream into a byte array
data = new byte[ms.Length];
ms.Read(data, 0, data.Length);
}
//data now holds the bytes of the image
return data;
}
さて、私はあなたが持っているコードをかなり単純にすることができます:
public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
{
using (MemoryStream ms = new MemoryStream())
{
WriteableBitmap btmMap = new WriteableBitmap
(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
// write an image into the stream
Extensions.SaveJpeg(btmMap, ms,
bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);
return ms.ToArray();
}
}
...しかし、それではおそらく問題は解決しません。
もう1つの問題は、bitmapImage
の-sizeのみを使用していることです。ある時点でそれをbtmMap
にコピーするべきではありませんか?
これを使用しているだけではない理由はありますか?
WriteableBitmap btmMap = new WriteableBitmap(bitmapImage);
エラーが発生した場所について詳しく教えてください。
あなたの問題が正確に何であるかはわかりませんが、次のコードは非常に動作することがわかっているコードからのマイナーな変更です(私はBitmapImageではなくWriteableBitmapを渡していました):
public static byte[] ConvertToBytes(this BitmapImage bitmapImage)
{
byte[] data = null;
using (MemoryStream stream = new MemoryStream())
{
WriteableBitmap wBitmap = new WriteableBitmap(bitmapImage);
wBitmap.SaveJpeg(stream, wBitmap.PixelWidth, wBitmap.PixelHeight, 0, 100);
stream.Seek(0, SeekOrigin.Begin);
data = stream.GetBuffer();
}
return data;
}
私は同じ問題を抱えていました、これはそれを解決します:
前のコード:
BitmapImage bi = new BitmapImage();
bi.SetSource(e.ChosenPhoto);
WriteableBitmap wb = new WriteableBitmap(bi);
後のコード:
BitmapImage bi = new BitmapImage();
bi.CreateOptions = BitmapCreateOptions.None;
bi.SetSource(e.ChosenPhoto);
WriteableBitmap wb = new WriteableBitmap(bi);