2016-05-17 4 views
0

Прежде всего, я сожалею о своем бедном английском.WriteableBitmap to Base64 C#

Я работаю над этим проектом в течение нескольких дней без решения моей проблемы. Я пытаюсь отправить изображение из моего приложения UWP в Webservice в C#. Я сделал эту вещь в приложении для Android без каких-либо проблем.

Я должен закодировать изображение в строку base64, которую webservice может декодировать.

У меня есть две проблемы: во-первых, если я попробую (с онлайн-декодером) декодировать мою base64 строку, это дало мне что-то вроде этого с помощью этого кода.

На изображении мы можем увидеть это не показать всю картину .:

Я пишу его с этим кодом в base64:

private async void ToBase64(WriteableBitmap img) 
{ 
    var encoded = new InMemoryRandomAccessStream(); 

    // Copy buffer to pixels 
    byte[] pixels; 
    using (var stream = img.PixelBuffer.AsStream()) 
    { 
     pixels = new byte[(uint)stream.Length]; 
     await stream.ReadAsync(pixels, 0, pixels.Length); 
    } 

    var encoder = await BitmapEncoder 
     .CreateAsync(BitmapEncoder.PngEncoderId, encoded); 
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, 
     BitmapAlphaMode.Premultiplied, (uint)img.PixelWidth, (uint)img.PixelHeight 
     , 96, 96, pixels); 
    await encoder.FlushAsync(); 
    encoded.Seek(0); 

    var array = new byte[encoded.Size]; 
    await encoded.AsStream().ReadAsync(array, 0, array.Length); 

    Base64String = Convert.ToBase64String(array); 
} 

Мой второй вопрос заключается в том, что если я попытаюсь отправить этот Base64 на мои веб-сервисы и декодировать его с помощью FromBase64String, webservice возвращает ошибку «Строковый формат base64 неверен». Я не понимаю этого, потому что, как мы видим, онлайн-декодер может декодировать его, и у меня нет этой проблемы с Android-приложением.

Если у вас есть идеи по этим вопросам. Я пробовал несколько вещей, которые я видел в Интернете

Спасибо за заранее.

EDIT 1

Это мой метод декодирования. Этот метод работает с Bitmap base64 для отправки с помощью приложения android.

[WebMethod] 
    public string uploadPhoto(string image) 
     { 
      byte[] bytes = Convert.FromBase64String(image); 

      using (var imageFile = new FileStream("directory+filename", FileMode.Create)) 
      { 
       imageFile.Write(bytes, 0, bytes.Length); 
       imageFile.Flush(); 
      }  

      return number; 
     } 

EDIT 2

Он работает с этим кодом:

public async Task<String> SaveToBytesAsync(ImageSource imageSource) 
     { 
      byte[] imageBuffer; 
      var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 
      var file = await localFolder.CreateFileAsync("temp.jpg", CreationCollisionOption.ReplaceExisting); 
      using (var ras = await file.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.None)) 
      { 
       WriteableBitmap bitmap = imageSource as WriteableBitmap; 
       var stream = bitmap.PixelBuffer.AsStream(); 
       byte[] buffer = new byte[stream.Length]; 
       await stream.ReadAsync(buffer, 0, buffer.Length); 
       BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras); 
       encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96.0, 96.0, buffer); 
       await encoder.FlushAsync(); 

       var imageStream = ras.AsStream(); 
       imageStream.Seek(0, SeekOrigin.Begin); 
       imageBuffer = new byte[imageStream.Length]; 
       var re = await imageStream.ReadAsync(imageBuffer, 0, imageBuffer.Length); 
      } 
      await file.DeleteAsync(StorageDeleteOption.Default); 
      return Convert.ToBase64String(imageBuffer); 
     } 

декодирование на сервере дает полное изображение. Спасибо.

+0

Попробуйте метод кодирования, показанный здесь: http://stackoverflow.com/a/37059782/1136211 – Clemens

ответ

0

Есть ли причина для кодирования изображения ?, попробуйте это.

string base64String = await ToBase64Async(bitmap); 

    public async Task<string> ToBase64Async(WriteableBitmap bitmap) 
    { 
     using (Stream stream = bitmap.PixelBuffer.AsStream()) 
     { 
      stream.Position = 0; 
      var reader = new DataReader(stream.AsInputStream()); 
      var bytes = new byte[stream.Length]; 
      await reader.LoadAsync((uint)stream.Length); 
      reader.ReadBytes(bytes); 
      return Convert.ToBase64String(bytes); 
     } 

    } 
+0

Спасибо за ответ, но я уже попробовал это Это дало мне нечто подобное: «CxMS/wsTEv8NEhH/DRIR/xEREf8RERH/FRAR/xQPEP8UDxD/FA8Q/xQPEP8UDxD/EhAQ/xIQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ/xAQEP8QEBD/EBAQ /", но я не могу декодировать он с онлайн-декодером или с Convert.FromBase64String на стороне сервера. Я не знаю, что делать:/ –

+0

У меня есть новости. Ошибка, возникшая при попытке отправить эту строку, связана с тем, что строка слишком велика. Я изменяю размер изображения и все в порядке во время отправки. Теперь проблема в том, что у меня есть поврежденный файл, когда я его декодирую на стороне сервера и сохраняю. –

+0

Добавьте свой код декодирования. – Stamos

0

Попробуйте использовать код base64

private async Task<string> ToBase64(Image control) 
{ 
    var bitmap = new RenderTargetBitmap(); 
    await bitmap.RenderAsync(control); 
    return await ToBase64(bitmap); 
} 

И если у вас есть WriteableBitmap, попробуйте использовать код:

private async Task<string> ToBase64(WriteableBitmap bitmap) 
{ 
    var bytes = bitmap.PixelBuffer.ToArray(); 
    return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight); 
} 

Если изображение является SotrageFile, вы можете использовать

private async Task<string> ToBase64(StorageFile bitmap) 
{ 
    var stream = await bitmap.OpenAsync(Windows.Storage.FileAccessMode.Read); 
    var decoder = await BitmapDecoder.CreateAsync(stream); 
    var pixels = await decoder.GetPixelDataAsync(); 
    var bytes = pixels.DetachPixelData(); 
    return await ToBase64(bytes, (uint)decoder.PixelWidth, (uint)decoder.PixelHeight, decoder.DpiX, decoder.DpiY); 
} 

Если ваше изображение Render TargetBitmap

private async Task<string> ToBase64(RenderTargetBitmap bitmap) 
{ 
    var bytes = (await bitmap.GetPixelsAsync()).ToArray(); 
    return await ToBase64(bytes, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight); 
} 

См https://codepaste.net/ijx28i

http://lindexi.oschina.io/lindexi/post/win10-uwp-%E8%AF%BB%E5%8F%96%E4%BF%9D%E5%AD%98WriteableBitmap-BitmapImage/