2013-07-26 23 views
13

ho il seguente codice per convertire immagini in Base64:Conversione immagine da base64

private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 
     StreamResourceInfo sri = null; 
     Uri uri = new Uri("Checked.png", UriKind.Relative); 
     sri = Application.GetResourceStream(uri); 

     BitmapImage bitmap = new BitmapImage(); 
     bitmap.SetSource(sri.Stream); 
     WriteableBitmap wb = new WriteableBitmap(bitmap); 

     MemoryStream ms = new MemoryStream(); 
     wb.SaveJpeg(ms, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100); 
     byte[] imageBytes = ms.ToArray(); 

     base64 = System.Convert.ToBase64String(imageBytes); 

    } 

E il seguente codice per ottenere forma di immagine bitmap di base 64:

public static BitmapImage base64image(string base64string) 
    { 
     byte[] fileBytes = Convert.FromBase64String(base64string); 

     using (MemoryStream ms = new MemoryStream(fileBytes, 0, fileBytes.Length)) 
     { 
      ms.Write(fileBytes, 0, fileBytes.Length); 
      BitmapImage bitmapImage = new BitmapImage(); 
      bitmapImage.SetSource(ms); 
      return bitmapImage; 
     } 
    } 

Così, quando mi converto e deconvert è vuoto

so che lavori deconvertitore, perché, quando gli do stringa esatta:

string base64="iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAQAAABLCVATAAACH0lEQVR42q3WoZKrMBQGYGRkIpHEoY9DMrh1nUGtzxPcGV7gCsTaK3iBCqa2ipmrVqLrWrmytjL3nBwoEGD30ja/6JaSj/wp3SEIXjpUoB+Oeg0zpoR+NsyoDVOgi39cbYHAy4MQTc0wOYZepxRBUkn9UxxEiNnXxyYwd6w/438hSddHJilv1tqv664Shle1DeJaJihPV9uNQ+NWBRK2QVSr+GjtaFzOIpdjKFShnoY+Gv0N0u0OVLexY48NQ+68JchdpQu/o1piVMu6faJdwjNWIAYyl55bqGUtbndO53TzCIpUpCkdlEm+V3J3Ir8r3uops2+FkTmvx832IGJwN97xS/5Ti0LQ/WLwtbxMal2ueAwvc2c8CAgSJip5U4+tKHECMlUzq2UcA9EyROuJi6/71dtzWAfVcq0Jw1CsYh13kDDteVoirE+zWtLVinQ8ZAS5YlVlvRHWfi3pakUQL0OOwmp/W/vN6Gt5zBIkzEezxnCtMJsxDIECTYmhp3bej4HHzaalNMyAnzE0UBKp6Z1Do2pwd3JkAH6CxlTs/bZOZ661yMwhohDLQqREMWz8UAvWoUQleggehG5dSPUbv28GJlnKHGJsqPi7vuG/MGTyCGslOtkCOayrGOa/indajdudb6FUpXoepgiLHIIMriddyzrkMBhGAqlOH4U2hKCT2j0NdU8jFbzpZ3LQlh9srPqEQ1Y9lEP2CVa99KHvH8mnrGGdl9V9AAAAAElFTkSuQmCC"; 

che è il mio Checked.png convertito in convertitore online. Si decomprime perfettamente.

E questo è il mio Base64, che ottengo convertendo:

"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" 

mio problema è che stringa che ottengo come Base64 dal mio codice - non è corretto * cosa ho sbagliato? *

+0

Per favore aggiungi domande/problemi alle tue dichiarazioni. Finora non vi è nulla di particolarmente brutto nel campione né alcuna informazione su cosa non funziona/quali errori si ottengono. –

+0

dove stai riscontrando problemi o che cosa non funziona? –

+0

Cosa intendi per "errato"? La sequenza di byte rappresenta l'immagine jpg ** perfettamente valida di un segno di spunta ... –

risposta

20

Che dire provare:

public static BitmapImage base64image(string base64string) 
{ 
    byte[] fileBytes = Convert.FromBase64String(base64string); 

    using (MemoryStream ms = new MemoryStream(fileBytes)) 
    { 
     Image streamImage = Image.FromStream(ms); 
     context.Response.ContentType = "image/jpeg"; 
     streamImage.Save(context.Response.OutputStream, ImageFormat.Jpeg); 
     return streamImage; 
    } 
} 

Concordo con Alessio che il codice per la lettura dell'immagine in ha un aspetto un po 'strano. Ho recentemente scritto del codice per un'attività simile che stavo facendo e che potrebbe indirizzarti nella giusta direzione:

 string fileContent = null; 
     /* Check the file actually has some content to display to the user */ 
     if (uploadFile != null && uploadFile.ContentLength > 0) 
     { 
      byte[] fileBytes = new byte[uploadFile.ContentLength]; 
      int byteCount = uploadFile.InputStream.Read(fileBytes, 0, (int)uploadFile.ContentLength); 
      if (byteCount > 0) 
      { 
       fileContent = CreateBase64Image(fileBytes); 
      } 
     } 

    private string CreateBase64Image(byte[] fileBytes) 
    { 
     Image streamImage; 
     /* Ensure we've streamed the document out correctly before we commit to the conversion */ 
     using (MemoryStream ms = new MemoryStream(fileBytes)) 
     { 
      /* Create a new image, saved as a scaled version of the original */ 
      streamImage = ScaleImage(Image.FromStream(ms)); 
     } 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      /* Convert this image back to a base64 string */ 
      streamImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
      return Convert.ToBase64String(ms.ToArray()); 
     } 
    } 
2

non una risposta: più di un lungo commento ... OP afferma che il codice di decodifica funziona perfettamente, anche sembra sospetto. Anche il codice presume essere verificato funzionare su immagini PNG, ma codice di salvataggio produce esplicitamente JPG valido SaveJpeg chiamata ...


Il codice che crea flusso per la lettura sembra strano - si crea flusso di sopra di byte esistente, di scrivere gli stessi byte in quel flusso e che passano quel flusso senza cercare di tornare a 0 in qualche metodo.

Potenziale fix (supponendo BitampImage può accettare flusso JPG):

  • non chiamare Write affatto come flusso già i byte che si desidera
  • set ms.Position = 0 dopo aver scritto al flusso.

Nota: Non sono sicuro se è OK per disporre torrente che è una fonte per BitmapImage, potrebbe essere necessario rimuovere using troppo.

Problemi correlati