假设我们有以下颜色:
const Scalar TRANSPARENT2 = Scalar(255, 0, 255,0);
是洋红色但完全透明:alpha = 0(完全不透明是255)。
现在我根据以下内容进行了以下测试:
http://blogs.msdn.com/b/lucian/archive/2015/12/04/opencv-first-version-up-on-nuget.aspx
WriteableBitmap^ Grabcut::TestTransparent()
{
Mat res(400,400, CV_8UC4);
res.setTo(TRANSPARENT2);
WriteableBitmap^ wbmp = ref new WriteableBitmap(res.cols, res.rows);
IBuffer^ buffer = wbmp->PixelBuffer;
unsigned char* dstPixels;
ComPtr<IBufferByteAccess> pBufferByteAccess;
ComPtr<IInspectable> pBuffer((IInspectable*)buffer);
pBuffer.As(&pBufferByteAccess);
pBufferByteAccess->Buffer(&dstPixels);
memcpy(dstPixels, res.data, res.step.buf[1] * res.cols * res.rows);
return wbmp;
}
我遇到的问题是创建的图像不是完全透明的,它有一些alpha:
我知道memcpy数据中有一个细丝,但我不确定如何解决这个问题。任何想法让它成为alpha 0?
更多详情
要看到我保存图像然后可以读取并测试它是否有效,我看到imwrite包含一个关于透明度的片段,就像在图像中一样,但是imwrite还没有实现。但是透明度方法也没有用。
这个片段有什么亮点吗?
感谢。
答案 0 :(得分:0)
最后我在C#代码中进行了转换,首先避免调用CreateAlphaMat。 然后我做的是使用BitmapEncoder转换数据:
WriteableBitmap wb = new WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
using (IRandomAccessStream stream = new InMemoryRandomAccessStream())
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
Stream pixelStream = bitmap.PixelBuffer.AsStream();
byte[] pixels = new byte[pixelStream.Length];
await pixelStream.ReadAsync(pixels, 0, pixels.Length);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied,
(uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96.0, 96.0, pixels);
await encoder.FlushAsync();
wb.SetSource(stream);
}
this.MainImage.Source = wb;
其中bitmap是OpenCV结果中的WriteableBitmap。现在图像完全透明。
注意:不要使用MemoryStream然后使用.AsRandomAccessStream,因为它不会FlushAsync