Неверный байт [] из WriteableBitmap в C# UWP10
Я хочу получить строку base64 из WriteableBitmap. Я считаю, что байт [] неверен.
Так как:
Код для создания изображения из base64 работает. Протестировано это при отправке строки base64 из файла. Однако я не вижу ничего, когда я использую свою функцию для WriteableBitmap для base64.
Мои попытки пока.
public static string GetByteArrayFromImage(WriteableBitmap writeableBitmap)
{
Stream stream = writeableBitmap.PixelBuffer.AsStream();
MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
Byte[] bytes = memoryStream.ToArray();
return Convert.ToBase64String(bytes);
}
public static string GetByteArrayFromImage(WriteableBitmap writeableBitmap)
{
Byte[] bytes = writeableBitmap.PixelBuffer.ToArray();
return Convert.ToBase64String(bytes);
}
Тестовый пример:
public static async Task<string> GetBase64StringFromFileAsync(StorageFile storageFile)
{
Stream ms = await storageFile.OpenStreamForReadAsync();
byte[] bytes = new byte[(int)ms.Length];
ms.Read(bytes, 0, (int)ms.Length);
return Convert.ToBase64String(bytes);
}
Байт [] имеет неправильный формат? Если так, как я могу исправить это?
Моя новая попытка
Stream stream = writeableBitmap.PixelBuffer.AsStream();
byte[] pixels = new byte[(uint)stream.Length];
await stream.ReadAsync(pixels, 0, pixels.Length);
using (var writeStream = new InMemoryRandomAccessStream())
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, writeStream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, (uint)writeableBitmap.PixelWidth, (uint)writeableBitmap.PixelHeight, 96, 96, pixels);
await encoder.FlushAsync();
}
return Convert.ToBase64String(pixels);
Эта попытка не меняет мой байт [] на правильный fromat.
2 ответа
Метод ниже создает BitmapEncoder
который работает на InMemoryRandomAccessStream
добавляет SoftwareBitmap
который создан из WriteableBitmap
, считывает содержимое потока в байтовый массив и, наконец, преобразует этот байтовый массив в строку base64:
public async Task<string> ToBase64String(WriteableBitmap writableBitmap)
{
using (var stream = new InMemoryRandomAccessStream())
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetSoftwareBitmap(SoftwareBitmap.CreateCopyFromBuffer(
writableBitmap.PixelBuffer,
BitmapPixelFormat.Bgra8,
writableBitmap.PixelWidth,
writableBitmap.PixelHeight));
await encoder.FlushAsync();
var bytes = new byte[stream.Size];
await stream.AsStream().ReadAsync(bytes, 0, bytes.Length);
return Convert.ToBase64String(bytes);
}
}
Если вы хотите преобразовать изображение в поток base64, лучшим способом было бы сначала закодировать его.
public static string GetByteArrayFromImage(BitmapSource writeableBitmap)
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(writeableBitmap));
MemoryStream stream = new MemoryStream();
encoder.Save(stream);
Byte[] bytes = stream.ToArray();
return Convert.ToBase64String(bytes);
}
public static BitmapSource GetImageFromByteArray(string base64String)
{
byte[] bytes = Convert.FromBase64String(base64String);
MemoryStream stream = new MemoryStream(bytes);
JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream,
BitmapCreateOptions.None, BitmapCacheOption.Default);
return decoder.Frames[0];
}
Тестовый пример, чтобы показать, что он работает:
BitmapImage originalImage = new BitmapImage(new Uri(@"Path to any picture", UriKind.Absolute));
string encoded = GetByteArrayFromImage(originalImage);
BitmapSource decoded = GetImageFromByteArray(encoded);
image1.Source = decoded;