2012-02-16 22 views
5

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.

+0

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

+1

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

Respuesta

3

SaveJpeg es la manera en que yo haría esto, creo. Probablemente podrías hacerlo de otras maneras, pero creo que sería más fácil y natural. Es probable que el error 'Esta transmisión no admita escritura en él' porque cualquier flujo que esté pasando a SaveJpeg no puede escribirse. No estoy exactamente seguro de lo que está intentando escribir en, trate de usar sólo una secuencia de memoria simple y llano y ver si funciona como tal

using System.IO; 

// ... 

MemoryStream ms = new MemoryStream(); 
pic.SaveJpeg(ms, pic.PixelWidth, pic.PixelHeight, 0, 0, 50); 

Se puede ajustar la calidad en el parámetro final. PixelWidth/Height es de WriteableBitmap, por lo que si tiene alguna otra fuente, es posible que deba usar otro método/propiedad para obtener el ancho/alto. Es posible que desee escalar estos ya que las imágenes de la cámara pueden ser bastante grandes. Depende de lo que está cargando estas imágenes, pero al escalarlas también puede reducir el tamaño del archivo.

+0

Gracias por su respuesta ameer. Actualicé mi publicación con un fragmento de código anterior. Eso es lo que estoy enfrentando actualmente. – Cranialsurge