Преобразование BitmapImage в Base64String в WinRT

Я хочу преобразовать BitmapImage в base64string в своих приложениях для Windows 8.1. КОД:

protected void UpdateSignatureAsync(BitmapImage bitmapImage, string fileName, long vehicleInsRecID)
{


    WriteableBitmap writimage = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
    using (MemoryStream ms = new MemoryStream())
    {
        WriteableBitmapExtensions.FromStream(writimage, ms);
        Stream s1 = writimage.PixelBuffer.AsStream();
        s1.CopyTo(ms);
        writimage.PixelBuffer.AsStream();
        var ic = new ImageCapture
        {
            ImageBinary = Convert.ToBase64String(ms.ToArray()),/// this line
            CaseServiceRecId = vehicleInsRecID,
            FileName = fileName
        };
        await UpdateImageAsync(ic);
    }

person Kashif    schedule 06.08.2015    source источник
comment
и с какой именно проблемой вы столкнулись?   -  person DL Narasimhan    schedule 06.08.2015
comment
... Итак, вы хотите сохранить данные изображения в виде растрового изображения? или вы пытаетесь сохранить необработанные пиксели?   -  person JuanK    schedule 06.08.2015
comment
Этот код неверен. BitmapImage не конвертирует WriteableBitmap. Он просто принимает высоту и ширину массива байтов BitmapImage (ms.ToArray()), каждый байт равен 0.   -  person Kashif    schedule 07.08.2015
comment
Вы использовали await в методе, который не является async — что-то еще не так с вашим примером кода.   -  person Peter Torr - MSFT    schedule 10.08.2015


Ответы (1)


У меня нет точного ответа на ваш вопрос, но если у вас есть StorageFile, который является изображением, вы можете преобразовать это изображение в строку Base64, используя метод GetBase64FromImageFile в следующем классе:

public static class ImageHash
{
    private static async Task<string> GetBase64FromImageFile(StorageFile file)
    {
        return ComputeHash(await ConvertToByteArray(file));
    }

    private static string ComputeHash(byte[] buffer)
    {
        IBuffer input = buffer.AsBuffer();
        IBuffer hashed = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Sha1).HashData(input);

        return CryptographicBuffer.EncodeToBase64String(hashed);
    }

    public async static Task<byte[]> ConvertToByteArray(StorageFile imageFile)
    {
        byte[] srcPixels;
        RandomAccessStreamReference streamRef =
            RandomAccessStreamReference.CreateFromFile(imageFile);

        using (IRandomAccessStreamWithContentType fileStream =
            await streamRef.OpenReadAsync())
        {
            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);
            BitmapFrame frame = await decoder.GetFrameAsync(0);

            // I know the parameterless version of GetPixelDataAsync works for this image
            PixelDataProvider pixelProvider = await frame.GetPixelDataAsync();
            srcPixels = pixelProvider.DetachPixelData();
        }

        return srcPixels;
    }
}
person Kristian Vukusic    schedule 19.08.2015