我正在尝试将加载到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);
结果是一样的。
知道为什么参数不匹配吗
1条答案
按热度按时间xwmevbvl1#
代码需要额外的强制转换,所以类似于这样: