2013-07-26 9 views
13

Mam następujący kod do konwersji obrazu do base64:Konwersja obrazu do 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); 

    } 

i następujący kod, aby uzyskać formularz bitmapy bazę 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; 
     } 
    } 

więc kiedy konwertować i deconvert jest puste.

wiem, że prace deconverter, ponieważ, kiedy dać mu dokładnie ciąg:

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

który jest moim Checked.png przekształcone w przetworniku online. Decompreses doskonale.

a to mój base64, które otrzymuję poprzez konwersję:

"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAkACQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+AXyv978v/rUeV7N+X/1q0FhyFxnlc9vT6d+APcgV2HiL4cePvCGheCvFHizwR4w8L+GfiVo9/wCIvhz4i8ReGda0TQfH3h/S9av/AA3qeueCtX1OxtdP8V6Pp3iLS9U0G+1PQbm/srTWtNv9LnnjvrO4gjAOO0rRtS1zUtP0bRtPv9W1fVr600zS9K0y0nv9S1PUr+eO1sdP0+xtY5bq8vby6mitrW1t4pJ7ieWOGGN5HVS/WND1Xw9qup6Frumajout6JqN7pGs6Nq1lcadqukatptzLZajpmp6deRQ3dhqFhewTWl7ZXUMVza3MMsE8ccqMg/tk/4NKv8Agjy3xm+JkH/BTj9oDwss3wm+DXiC70v9l3QNZtEktfHvxp0Sd7XVvin9mucpc+Hfg9cB7PwxdC1lhu/irIdR0/UbPVfhdeW13yf/AAeM/Fj9iTXf2pvhp8IPg/8ACjwRJ+2H4N02PxJ+1F8dPCpbStUi0bWdGhX4e/CLxnY6TPBpHjPxmdHms/GWpeIfEthc+JPCXhj/AIQTw9o+tyafrms6PpYB/Fiy7Tjn8aKluV2yY/2RRQB7r8CtS+E3h34wfCvxD8efBvib4hfBXRfHnhLVfir4E8G+ILfwv4o8YeALLWLO58UeHtD1+5t7mLTNQ1TSUurSKY/ZJZPN8i31XRLiWLWLL/W48Q/Bf/gmX/wXm/4Jg6V8PfgkPhtqfwYT4ey+EfgFrOleDorLxX+xt8SNA8Jnwz4Ot4fh9pmseE9d8E6x8M2t9Jt9T+HEOveHvD/jvwbY2+l2uq6n4D8Q6Vrd3/kEQxfuYiMcxp3PdB+Fff8A/wAE7v8AgpB+1H/wTJ+Omn/Gv9mzxpLp9veT6ba/Ez4Wa1NdXXwy+L/hayunmPhzxx4eS4ijnmhjuL1dC8UaebXxX4Unvry58P6tZi+1GG7AP9Q3/gpJ+2p+zz/wQi/4JraUnww8MeHNE1Lwp4PsfgV+x58FbcKIvEPju20OSDR9R1i3iaG81Dw34RiSbx98U/Ed3PBe69Ik1nc6w3jPxro7ah/kLfEnx946+L/xB8b/ABV+JviXVvG3xF+I/ivXvG/jrxdrlws+r+JfFfibU7nV9c1nUZQsStdX+o3dxcyCKKG3jMnlW0ENvHFGv6ff8Fgf+CqPxQ/4K0ftQQfHDxdoEnw7+HHgrwxZeCfgx8HY/EDeI7H4f6AUhv8AxNfXeqrY6Tba34q8X+JjcalrmvpoumS3OmWnhnw+8Mtj4YsGH5ReT9PzNAHF6guy4K4wdi5HXrmip9YXbesP+mcfr6UUAdHb+NTFbwQ3Hhnw5qE0MUcT310fEUd1ciKNI0e4Fh4hsrRptqDzJY7WOSeQvNO0szvI0v8AwnEX/QneFf8Av74t/wDmroooAP8AhOIv+hO8K/8Af3xb/wDNXSjxzECD/wAIb4UODnBl8XYPsceLAcH2IPoRRRQByWp6g+p3kl21taWm8KqW1lE0UEUaDaiKZZJriUgcGa6uLi4fjzJnwMFFFAH/2Q==" 

Moim problemem jest to, że ciąg, który otrzymuję jako base64 z mojego kodu - jest nieprawidłowe * co zrobiłem źle? *

+0

Proszę dodać pytanie/problem do wyciągów. Jak dotąd w próbie nie ma nic szczególnie złego, ani żadnych informacji o tym, co nie działa/jakie są błędy. –

+0

gdzie masz problem lub co nie działa? –

+0

Co masz na myśli "niepoprawny"? Twoja sekwencja bajtowa reprezentuje doskonale prawidłowy ** obraz jpg ** znacznika wyboru ... –

Odpowiedz

20

Co o próbie:

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; 
    } 
} 

zgadzam się z Aleksym, że kod do odczytu obrazu w wygląda trochę dziwnie. Ostatnio napisałem kod do podobnego zadania, które robiłem, co może wskazać ci właściwy kierunek:

 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

brak odpowiedzi: więcej długiego komentarza ... OP stwierdza, że ​​kod dekodujący działa idealnie dobrze, również wygląda podejrzanie. Zakłada się również kod być przetestowany na PNG, ale wyraźnie daje oszczędność Kod ważny JPG z SaveJpeg rozmowy ...


Twój kod, który tworzy strumień do odczytu wygląda dziwnie - tworzenie strumienia nad istniejącej tablicy bajtów, niż zapisywanie tych samych bajtów w tym strumieniu, które przekazują ten strumień bez szukania z powrotem do 0 dla pewnej metody.

Potencjał fix (zakładając BitampImage może zaakceptować strumień JPG):

  • nie nazywają Write w ogóle jako strumień już bajty chcesz
  • ustawić ms.Position = 0 po zapisie strumienia.

Uwaga: Nie jestem pewien, czy to jest OK, aby wyrzucać strumień, który jest źródłem BitmapImage, być może trzeba będzie usunąć using też.