【问题标题】:Converting PNG to Bitmap with transparency using opencv使用opencv将PNG转换为具有透明度的位图
【发布时间】:2016-07-27 22:42:43
【问题描述】:

我有一个透明的 png 图像。我使用opencv读取了该文件。然后我将其转换为位图,如下所示。

Mat image = imread("fruit.png", -1);
BYTE * rawdata = reinterpret_cast<BYTE*>(image.data);
m_pBitmap->CopyFromMemory(NULL, rawdata, image.cols * 4);
m_pRenderTarget->DrawBitmap(m_pBitmap);

但是在转换一些图像后显示一些透明度问题...与link 相同,并且图像未显示完整。但是当我们使用 imwrite 保存 Mat 图像时,没有问题。 所以我面临的问题是

  1. 部分图片的透明度丢失。
  2. 未显示完整的图像数据。

【问题讨论】:

  • 您引用的链接似乎是imshow 的问题,而不是图像本身的问题,您可以编辑以显示您是如何初始化Bitmap 变量的吗?这个位图类在android中吗?

标签: c++ opencv bitmap directx


【解决方案1】:

您应该在 OpenCV 中转换图像格式,因为不同的库有自己的解码和表示方法。

试试下面的代码:

Mat image = imread("fruit.png", -1);
Mat image_bmp;
image.convertTo(image_bmp, CV_8UC3);
imwrite("fruit.bmp", image_bmp);

您可以通过文件名中的.bmp.jpg 指定要保存图像的格式。

结果看起来像这样(当然是在调整大小之后):

【讨论】:

  • 从用户的示例代码来看,他指的不是位图文件,而是c++中的位图类……我认为是android的位图类。
  • @api55 ...好吧,在这种情况下,我个人认为用jint *buf = env-&gt;GetIntArrayElements()声明Mat并在c ++中将位图作为int数组处理更方便:)
  • 当然,它可能更方便(但我更喜欢坚持使用 opencv 的 uchar 表示),但它仍然不能解决问题......我认为他正在使用不同的表示那个方向的字节或其他东西,但在他回答之前不确定
  • @JohnHany 我需要转换后的透明图像,我不是在谈论 DirectX 中的位图类。
  • @Neeraj ...那么不需要坚持使用opencv,至少不需要图像解码部分,对吧?我用谷歌搜索了“opencv direct2d”,很少有结果支持将它们组合在一起。也许 opencv 不是 Direct2D 友好端口的第一选择;)
猜你喜欢
  • 2020-09-05
  • 2012-01-29
  • 2018-06-05
  • 2015-01-26
  • 2021-12-06
  • 2016-04-30
  • 1970-01-01
  • 2017-12-06
  • 2011-06-04
相关资源
最近更新 更多