Cómo convertir una imagen a matriz de bytes en Windows Phone 8.1 usando c#
windows-phone-8.1 (3)
Estoy usando este código
MemoryStream ms = new MemoryStream();
WriteableBitmap wb = new WriteableBitmap(myimage);
wb.SaveJpeg(ms, myimage.PixelWidth, myimage.PixelHeight, 0, 100);
byte [] imageBytes = ms.ToArray();
desde Convertir imagen a matriz de bytes en Windows Phone 7 No System.Drawing Dll de otra manera? pero WriteableBitmap no contiene el método SaveJpeg en el entorno de Windows phone 8.1.
SaveJpeg es un método de extensión ( http://msdn.microsoft.com/en-US/library/windowsphone/develop/system.windows.media.imaging.extensions.savejpeg(v=vs.105).aspx ). ¿Ha hecho referencia a Microsoft.Phone
en las referencias de su proyecto y agregado using System.Windows.Media.Imaging;
a su archivo .cs?
En Windows Phone 8.1, las aplicaciones de Silverlight funcionan bien, supongo que myImage
es una BitmapImage
. Lo único que debe hacer es esperar a que BitmapImage
cargue por completo:
using System.IO;
using System.Windows.Media.Imaging;
...
myImage = new BitmapImage(new Uri("http://i.stack.imgur.com/830Ke.jpg?s=128&g=1", UriKind.Absolute));
myImage.CreateOptions = BitmapCreateOptions.None;
myImage.ImageOpened += myImage_ImageOpened;
...
void myImage_ImageOpened(object sender, RoutedEventArgs e)
{
MemoryStream ms = new MemoryStream();
WriteableBitmap wb = new WriteableBitmap(myImage);
wb.SaveJpeg(ms, myImage.PixelWidth, myImage.PixelHeight, 0, 100);
byte[] imageBytes = ms.ToArray();
}
Acabo de probar ese código y funciona perfectamente en WP8.1.
Pero como comentó en otra publicación, no puede hacer referencia a Microsoft.Phone
, probablemente esté haciendo una aplicación Windows Phone 8.1 Store, en cuyo caso puede usar el siguiente código:
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage.Streams;
using System.Runtime.InteropServices.WindowsRuntime;
...
BitmapImage bitmapImage = new BitmapImage(new Uri("http://i.stack.imgur.com/830Ke.jpg?s=128&g=1"));
RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromUri(bitmapImage.UriSource);
var streamWithContent = await rasr.OpenReadAsync();
byte[] buffer = new byte[streamWithContent.Size];
await streamWithContent.ReadAsync(buffer.AsBuffer(), (uint)streamWithContent.Size, InputStreamOptions.None);
Sospecho que está apuntando a Windows Runtime Apps ya que no ha encontrado el espacio de nombres sugerido en esta respuesta (que funcionará para WP8.1 Silverlight) .
En las aplicaciones de Windows Runtime puede usar Encoder
: el código de ejemplo puede verse así:
// lets assume that you have your image in WriteableBitmap yourWb
using (MemoryStream ms = new MemoryStream())
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, ms.AsRandomAccessStream());
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
imageWidth,
imageHeight,
horizontalDPI,
verticalDPI,
yourWb.PixelBuffer.ToArray());
await encoder.FlushAsync();
}