Прежде всего, я сожалею о своем бедном английском.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);
}
декодирование на сервере дает полное изображение. Спасибо.
Попробуйте метод кодирования, показанный здесь: http://stackoverflow.com/a/37059782/1136211 – Clemens