【问题标题】:ICanvasBitmap from BitmapSource来自 BitmapSource 的 ICanvasBitmap
【发布时间】:2016-12-08 17:23:44
【问题描述】:

有没有办法将 Windows.UI.Xaml.Media.Imaging.BitmapSource 对象转换为实现 Microsoft.Graphics.Canvas.ICanvasImage 的类的成员?接口本身只包含两个获取矩形的方法。但是,我认为这还不够,因为我的最终目标是调用

CanvasDrawingSession.DrawImage()

我不得不想象需要一种方法来获取位图像素。

【问题讨论】:

  • 你的 BitmapSource 来自哪里?
  • Splat 库。 github.com/paulcbetts/splat——让事情变得困难的根本问题是我正在为多个平台进行开发。但我最终决定这已经够混乱了,在 Windows 的情况下最好完全绕过 BitmapSource。
  • 我问,因此使用 SoftwareBitmap 而不是 BitmapSource 可能会更容易。因此,可以立即从中创建 CanvasImage
  • 嗯,这个想法是 Splat 加载隐藏了平台依赖关系。但在这种情况下,它不会飞,所以我只是从流中获取它。
  • 如果你有一个流,那么你可能可以使用 SoftwareBitmapBitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream); return await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Rgba16, BitmapAlphaMode.Premultiplied);。然后你可以使用 *CanvasBitmap.CreateFromSoftwareBitmap(...)`。

标签: c# uwp bitmapsource win2d


【解决方案1】:

您无法直接从 Windows.UI.Xaml.Media.Imaging.BitmapImage 获取像素。但是您可以使用WriteableBitmap 而不是BitmapImage。然后就可以通过它的PixelBuffer属性获取像素数据了。

之后,您可以使用CanvasBitmap.CreateFromBytes() 方法创建CanvasBitmap。然后使用这个 CanvasBitmap 对象作为参数调用CanvasDrawingSession.DrawImage() 方法。

【讨论】:

    【解决方案2】:

    除了使用 PixelBuffer,就像上面的 described by Xavier Xie,你可以使用 SoftwareBitmap 来创建你的 ICanvasImage。如果你有一个流,那么你可以这样做:

    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
    CanvasDrawingSession.DrawImage(await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Rgba16, BitmapAlphaMode.Premultiplied));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 2010-10-01
      相关资源
      最近更新 更多