【发布时间】:2018-02-14 00:38:02
【问题描述】:
所以我是 Direct2D 和图像处理世界的新手,现在有点迷路了。我有这张绿色背景的图片,我需要加载。但是在将其显示到屏幕之前必须删除绿色背景(使用 c++ 色度键)。
到目前为止,我已经成功地将 d2d 位图从 jpg/bmp 文件加载到屏幕上。抱歉,如果这是一个愚蠢的问题,但我在其他任何地方都找不到太多信息。这是我正在尝试处理的图像。
所以我用来加载位图的步骤是,创建 WIC 工厂,创建能够将文件读入 WIC 的解码器,创建 WIC 转换器并配置它。
最后一步是创建位图。
然后我使用RendetTarget->DrawBitmap() 方法将其绘制在屏幕上并传递适当的参数。
我现在唯一想不通的是如何从下图中删除绿屏。如果我的问题缺少一些必要的信息,请告诉我。任何帮助将不胜感激。
这是在屏幕上绘制位图的代码
gfx->GetRenderTarget()->DrawBitmap(
bmp, //Bitmap we built from WIC
D2D1::RectF(0, 0,
bmp->GetSize().width, bmp->GetSize().height),
0.8f, // opacity
D2D1_BITMAP_INTERPOLATION_MODE::D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR,
D2D1::RectF(0, 0, bmp->GetSize().width, bmp->GetSize().height) //Source Rect
);
这是我的可执行文件(窗口)的屏幕截图以及我目前所做的。 Main Window
这是加载位图的代码
this->gfx = gfx;
bmp = NULL;
HRESULT hr;
IWICImagingFactory *wicFactory = NULL;
hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
(LPVOID*)&wicFactory); // pointer to the WICFactory
// decoder
IWICBitmapDecoder *wicDecoder = NULL;
hr = wicFactory->CreateDecoderFromFilename(
filename, // filename passed as parameter
NULL,
GENERIC_READ,
WICDecodeMetadataCacheOnLoad,
&wicDecoder); // pointer to the Decoder
IWICBitmapFrameDecode* wicFrame = NULL;
hr = wicDecoder->GetFrame(0, &wicFrame);
// create wic converter
IWICFormatConverter *wicConverter = NULL;
hr = wicFactory->CreateFormatConverter(&wicConverter);
hr = wicConverter->Initialize(
wicFrame,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone,
NULL,
0.0,
WICBitmapPaletteTypeCustom
);
// create bitmap
gfx->GetRenderTarget()->CreateBitmapFromWicBitmap(
wicConverter,
NULL,
&bmp // destination bmp defined in header
);
【问题讨论】:
-
换句话说,它似乎表明那里什么都没有,因为你没有放任何东西。
-
您希望看到什么而不是绿色?分析该问题的答案,一切都会揭晓。
-
我们需要查看更多代码。此 Direct2D 呈现目标是直接在您的顶级窗口上还是在子窗口上?
-
您可以使绿色部分透明,但图像看起来不会很好。那个圆有一个光滑的圆周,这是由于抗锯齿。你仍然会看到一个微弱的绿色圆周。请改用具有多层透明度的 PNG 图像。我投票结束,因为您没有显示相关代码。
标签: c++ winapi image-processing direct2d