web-dev-qa-db-fra.com

Comment convertir Bitmap en une chaîne Base64?

J'essaie de capturer l'écran, puis de le convertir en une chaîne Base64. Voici mon code:

Rectangle bounds = Screen.GetBounds(Point.Empty);
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);

using (Graphics g = Graphics.FromImage(bitmap))
{
   g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
}

// Convert the image to byte[]
System.IO.MemoryStream stream = new System.IO.MemoryStream();
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] imageBytes = stream.ToArray();

// Write the bytes (as a string) to the textbox
richTextBox1.Text = System.Text.Encoding.UTF8.GetString(imageBytes);

// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);

En utilisant un richTextBox pour déboguer, il montre:

BM6� ~

Donc, pour une raison quelconque, les octets ne sont pas corrects, ce qui fait que la base64String devient nulle. Une idée de ce que je fais mal? Merci.

32
Joey Morani

Les caractères que vous obtenez en faisant System.Text.Encoding.UTF8.GetString(imageBytes) contiendront (presque certainement) des caractères non imprimables. Cela pourrait vous faire voir uniquement ces quelques personnages. Si vous le convertissez d'abord en chaîne de base64, il ne contiendra que des caractères imprimables et pourra être affiché dans une zone de texte:

// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);

// Write the bytes (as a Base64 string) to the textbox
richTextBox1.Text = base64String;
27
Tim S.

J'ai trouvé une solution à mon problème:

Bitmap bImage = newImage;  // Your Bitmap Image
System.IO.MemoryStream ms = new MemoryStream();
bImage.Save(ms, ImageFormat.Jpeg);
byte[] byteImage = ms.ToArray();
var SigBase64= Convert.ToBase64String(byteImage); // Get Base64
30

Pas besoin d byte[] ... il suffit de convertir le flux directement (avec des constructions)

using (var ms = new MemoryStream())
{    
  using (var bitmap = new Bitmap(newImage))
  {
    bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    var SigBase64= Convert.ToBase64String(ms.GetBuffer()); //Get Base64
  }
}
11
Onyximo