【问题标题】:Windows Phone Runtime: RendertargetBitmap/IBuffer to Base64 and vice versaWindows Phone 运行时:RendertargetBitmap/IBuffer 到 Base64,反之亦然
【发布时间】:2016-05-12 21:30:37
【问题描述】:

我目前正在尝试将从 RenderTargetBitmap 获得的 IBuffer 转换为 Base64String,反之亦然。我在 Silverlight 中成功完成了类似的操作,但现在在 Windows 运行时中缺少很多库,我不知道现在该尝试什么。

下面是我最新的示例代码,它不会出错,但是当我尝试运行它时它会让我的应用程序崩溃。有什么建议吗?

提前致谢

        var bitmap = new RenderTargetBitmap();
        await bitmap.RenderAsync(drawingPanel);

        IBuffer pixel = await bitmap.GetPixelsAsync();

        String b64 = CryptographicBuffer.EncodeToBase64String(pixel);

        IBuffer backpixel = CryptographicBuffer.DecodeFromBase64String(b64);

        WriteableBitmap wb = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
        wb.SetSource(backpixel.AsStream().AsRandomAccessStream());

        imageBox.Source = wb;

imageBox 是一个 XAML 元素,用于检查转换是否成功

编辑:这段代码没有异常,应用程序只是冻结

【问题讨论】:

  • 在哪一行出现异常
  • 也不例外。它的字面意思是什么都没有发生。我单步执行了代码,所有变量都填满了,但最终结果什么都没有

标签: c# windows-runtime windows-phone-8.1 win2d


【解决方案1】:
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
            await renderTargetBitmap.RenderAsync(MyCanvas);
            var bitmap = renderTargetBitmap;
            var img = (await bitmap.GetPixelsAsync()).ToArray();
            var encoded = new InMemoryRandomAccessStream();
            var encoder = await BitmapEncoder.CreateAsync(
                BitmapEncoder.PngEncoderId, encoded);
            encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight,
                (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96, 96, img);
            await encoder.FlushAsync();
            encoded.Seek(0);
            var bytes = new byte[encoded.Size];
            await encoded.AsStream().ReadAsync(bytes, 0, bytes.Length);
            return Convert.ToBase64String(bytes);

有时这对我有用,遗憾的是有时它仍然会出错,但我不知道为什么

【讨论】:

    【解决方案2】:

    使用下面的,我想我会工作的

                        var bitmap = new RenderTargetBitmap();
                        await bitmap.RenderAsync(drawingPanel);
    
                        IBuffer pixel = await bitmap.GetPixelsAsync();
                        Stream stream = pixel.AsStream();
                        BitmapImage bitmapImage = new BitmapImage();
                        using (IRandomAccessStream raStream = stream.AsRandomAccessStream())
                        {
                            bitmapImage.SetSource(raStream);
                        }
                        imageBox.Source = bitmapImage;
    

    【讨论】:

    • 感谢您的回复,但是:1)此代码也不起作用(同样没有例外,应用程序只是冻结)和 2)它没有回答我的问题,因为我想转换为 base64String,反之亦然
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2014-05-22
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多