Visual Studio Win2D CanvasBitmap::从参数不匹配

isr3a4wc  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(97)

我正在尝试将加载到cv::Mat对象中的图像渲染到Win2D画布上。
画布:

<canvas:CanvasControl Draw="CanvasControlDraw" x:Name="GalleryCanvas" ClearColor="#004400"/>

绘图功能:

void TableContentPage::CanvasControlDraw(
    [[maybe_unused]] winrt::Microsoft::Graphics::Canvas::UI::Xaml::
        CanvasControl const &sender,
    [[maybe_unused]] winrt::Microsoft::Graphics::Canvas::UI::Xaml::
        CanvasDrawEventArgs const &args)
{
  auto session = args.DrawingSession();

  cv::Mat inputImage = cv::imread("image_path.jpg");

  auto device = CanvasDevice::GetSharedDevice();

  winrt::array_view<uint8_t const> view((uint8_t *)inputImage.data,
                                        (uint32_t)inputImage.size.dims());

  const auto format =
      Microsoft::Graphics::DirectX::DirectXPixelFormat::B8G8R8A8UIntNormalized;

  auto bitmap =
      winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(
          device, view, (int32_t)inputImage.cols, (int32_t)inputImage.rows,
          format);
  session.DrawImage(bitmap);
}

自定义生成以下错误:

1>C:\Users\user\project\InterfaceItem.xaml.cpp(108,57): error C2665: 'winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes': no overloaded function could convert all the argument types
1>C:\Users\user\project\Generated Files\winrt\Microsoft.Graphics.Canvas.h(4284,31): message : could be 'winrt::Microsoft::Graphics::Canvas::CanvasBitmap winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(const winrt::Microsoft::Graphics::Canvas::ICanvasResourceCreator &,const winrt::Windows::Storage::Streams::IBuffer &,int32_t,int32_t,const winrt::Windows::Graphics::DirectX::DirectXPixelFormat &)'
1>C:\Users\user\project\InterfaceItem.xaml.cpp(108,57): message : 'winrt::Microsoft::Graphics::Canvas::CanvasBitmap winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(const winrt::Microsoft::Graphics::Canvas::ICanvasResourceCreator &,const winrt::Windows::Storage::Streams::IBuffer &,int32_t,int32_t,const winrt::Windows::Graphics::DirectX::DirectXPixelFormat &)': cannot convert argument 2 from 'winrt::array_view<const uint8_t>' to 'const winrt::Windows::Storage::Streams::IBuffer &'
1>C:\Users\user\project\InterfaceItem.xaml.cpp(109,51): message : Reason: cannot convert from 'winrt::array_view<const uint8_t>' to 'const winrt::Windows::Storage::Streams::IBuffer'
1>C:\Users\user\project\InterfaceItem.xaml.cpp(109,51): message : No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1>C:\Users\user\project\Generated Files\winrt\Microsoft.Graphics.Canvas.h(4272,31): message : or       'winrt::Microsoft::Graphics::Canvas::CanvasBitmap winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(const winrt::Microsoft::Graphics::Canvas::ICanvasResourceCreator &,winrt::array_view<const uint8_t>,int32_t,int32_t,const winrt::Windows::Graphics::DirectX::DirectXPixelFormat &)'
1>C:\Users\user\project\InterfaceItem.xaml.cpp(108,57): message : 'winrt::Microsoft::Graphics::Canvas::CanvasBitmap winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(const winrt::Microsoft::Graphics::Canvas::ICanvasResourceCreator &,winrt::array_view<const uint8_t>,int32_t,int32_t,const winrt::Windows::Graphics::DirectX::DirectXPixelFormat &)': cannot convert argument 5 from 'const winrt::Microsoft::Graphics::DirectX::DirectXPixelFormat' to 'const winrt::Windows::Graphics::DirectX::DirectXPixelFormat &'
1>C:\Users\user\project\InterfaceItem.xaml.cpp(109,61): message : Reason: cannot convert from 'const winrt::Microsoft::Graphics::DirectX::DirectXPixelFormat' to 'const winrt::Windows::Graphics::DirectX::DirectXPixelFormat'
1>C:\Users\user\project\InterfaceItem.xaml.cpp(109,61): message : Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or parenthesized function-style cast)
1>C:\Users\user\project\InterfaceItem.xaml.cpp(108,57): message : while trying to match the argument list '(winrt::Microsoft::Graphics::Canvas::CanvasDevice, winrt::array_view<const uint8_t>, int, int, const winrt::Microsoft::Graphics::DirectX::DirectXPixelFormat)'

我试着用更简单的方式打电话,像这样,

auto const& formatRef = format;
winrt::Microsoft::Graphics::Canvas::CanvasBitmap bitmap =
    winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(
        device, winrt::array_view<uint8_t const>(), 1, 1, formatRef);

结果是一样的。
知道为什么参数不匹配吗

xwmevbvl

xwmevbvl1#

代码需要额外的强制转换,所以类似于这样:

auto bitmap =
  winrt::Microsoft::Graphics::Canvas::CanvasBitmap::CreateFromBytes(
      device, view, (int32_t)inputImage.cols, (int32_t)inputImage.rows,
      (winrt::Windows::Graphics::DirectX::DirectXPixelFormat const&)format);

相关问题