2011-03-17 15 views

Respuesta

29

he encontrado una solución limpia que funciona:

BitmapSource bitmapSource = Clipboard.GetImage(); 

JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
MemoryStream memoryStream = new MemoryStream(); 
BitmapImage bImg = new BitmapImage(); 

encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); 
encoder.Save(memoryStream); 

memoryStream.Position = 0; 
bImg.BeginInit(); 
bImg.StreamSource = memoryStream; 
bImg.EndInit(); 

memoryStream.Close(); 

return bImg; 
+3

¿Es necesario el uso de 'bImg.StreamSource = new MemoryStream (memoryStream.ToArray());' en lugar de 'bImg.StreamSource = memoryStream; 'y eliminando' memoryStream.Close(); ' – Elmo

+2

Debe agregar bImg.Freeze() al final para permitir llamadas multiproceso, de lo contrario funciona perfecto. – m1k4

+1

@ Don'tForgettoUpvote: Para mí 'bImg.StreamSource = new MemoryStream (memoryStream.ToArray());' era necesario, de lo contrario estaba lanzando una excepción. – dotNET

2
using System.IO; // namespace for using MemoryStream 

private static byte[] ReadImageMemory() 
{ 
    BitmapSource bitmapSource = BitmapConversion.ToBitmapSource(Clipboard.GetImage()); 
    JpegBitmapEncoder encoder = new JpegBitmapEncoder(); 
    MemoryStream memoryStream = new MemoryStream(); 
    encoder.Frames.Add(BitmapFrame.Create(bitmapSource)); 
    encoder.Save(memoryStream); 
    return memoryStream.GetBuffer(); 
} 

// and calling by this example........ 
byte[] buffer = ReadImageMemory(); 
Cuestiones relacionadas