Mi aplicación utiliza la cámara para tomar una imagen y cargarla en flickr. Me gustaría comprimir la imagen para que la carga no tome tanto tiempo como lo hace actualmente. Probé tanto el método BitmapSource como el método 'SaveJpeg' de WriteableBitmap para lograr esto, pero fallaron. El origen de mapa de bits no tiene los mismos miembros disponibles en Silverlight/WP que en la versión completa de .NET Framework y el método SaveJpeg, el WriteableBitmap me ha dejado un error de 'Esta secuencia no admite escribir en él'.Cómo comprimir una imagen en Windows Phone
Esto es lo que estoy haciendo actualmente en mi CameraCaptureTask controlador de eventos completado:
private void CameraCaptureCompleted(object sender, PhotoResult e)
{
if (e == null || e.TaskResult != TaskResult.OK)
{
return;
}
BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};
bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto));
WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);
// Encode the WriteableBitmap object to a JPEG stream.
writeableBitmap.SaveJpeg(e.ChosenPhoto, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85);
}
Este código me da: "Corriente no admite la escritura" error.
¿Hay alguna otra manera en que pueda comprimir una imagen o tendré que escribir un algoritmo de compresión?
¡ACTUALIZACIÓN FIJA!
private void CameraCaptureCompleted(object sender, PhotoResult e)
{
if (e == null || e.TaskResult != TaskResult.OK)
{
return;
}
BitmapImage bitmap = new BitmapImage {CreateOptions = BitmapCreateOptions.None};
bitmap.SetSource(AppHelper.LoadImage(e.ChosenPhoto));
WriteableBitmap writeableBitmap = new WriteableBitmap(bitmap);
// Encode the WriteableBitmap object to a JPEG stream.
writeableBitmap.SaveJpeg(new MemoryStream(), writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 85);
}
Estaba tratando de escribir en el flujo de la fuente. Doh!
Gracias.
PhotoResult e no es una secuencia, por lo que SaveJpeg no funcionará como destino, ¿dónde desea guardar la imagen? IsolatedStorage o una transmisión temporal o en otro lugar ... – ameer
Solo para que lo sepa, cuando lo guarde en un nuevo MemoryStream() no tiene referencia de dónde lo guardó ahora, es mejor crear el flujo de memoria antes, pasarlo al flujo de memoria luego, una vez que lo comprimes, cárgalo directamente desde la secuencia de la memoria o guárdalo en un almacenamiento aislado y súbelo más tarde. – ameer