-
[Direct2D] ID2D1Effect : Edge detectionC++/미분류 2024. 4. 17. 11:09
D2D Effect는 이미지의 가장자리를 탐색하고, 그 위치에 선을 그리는 기능을 제공합니다.
이번 글에서는 해당 기능을 이용하여 이미지의 가장자리를 탐색해보도록 하겠습니다.
이번 글의 출력 결과는 지난 글의 코드에서 이어집니다.
[Direct2D] ID2D1Effect 사용하기
[Direct2D] ID2D1Effect : Color matrix
Edge-detection effect - Win32 apps | Microsoft Learn또한, 위 MSDN에 기반하여 작성되었습니다.
1. Effect 생성 및 초기화
더보기D2D Effect는 Device context에 의해 초기화되며, 이 때 적용활 효과에 대한 ID를 사용합니다.
Edge detection은 다음과 같이 초기화 할 수 있습니다.
ComPtr<ID2D1Effect> edgeDetectionEffect; myDirect2dContext->CreateEffect( CLSID_D2D1EdgeDetection, &edgeDetectionEffect );
초기화 된 Effect객체에 효과를 적용할 이미지를 지정합니다.
ComPtr<ID2D1Bitmap> tmp = myCharacterBitmap->GetBitmap(); if (tmp) { edgeDetectionEffect->SetInput(0, tmp.Get()); ... }
이번 글에서는 위 코드가 아닌, 이전 글에서 사용된 변환 효과에 Edge detection을 적용해보도록 하겠습니다.
edgeDetectionEffect->SetInputEffect(0, affineTransformEffect.Get());
SetInputEffect함수는 이미지가 아닌 효과를 추가하는 함수입니다.
해당 함수를 사용할 경우, 지정한 효과에 추가적인 효과가 적용됩니다.
2. 속성 적용하기
더보기Edge detection은 아래와 같이 몇 가지의 속성을 적용할 수 있습니다.
edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_STRENGTH, {}); edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_BLUR_RADIUS, {}); edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_MODE, {}); edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_OVERLAY_EDGES, {}); edgeDetectionEffect->SetValue(D2D1_EDGEDETECTION_PROP_ALPHA_MODE, {});
D2D1_EDGEDETECTION_PROP_STRENGTH
- 외곽선의 강도를 나타내는 값 입니다. 값이 커질수록 선이 두꺼워집니다.
- 값의 허용 범위는 0.0 - 1.0이며, 기본값은 0.5입니다.
D2D1_EDGEDETECTION_PROP_BLUR_RADIUS
- 외곽선에 흐림 효과를 적용할 수 있는 속성입니다. 값이 커질수록 외곽선이 흐려집니다.
- 값의 허용 범위는 0.0 - 10.0이며, 기본값은 0.0입니다.
D2D1_EDGEDETECTION_PROP_MODE
- 외곽선 추출에 사용할 함수를 지정하는 속성입니다.
- D2D1_EDGEDETECTION_MODE_SOBEL과 D2D1_EDGEDETECTION_MODE_PREWITT를 지정할 수 있습니다.
- 기본값은 D2D1_EDGEDETECTION_MODE_SOBEL입니다.
D2D1_EDGEDETECTION_PROP_OVERLAY_EDGES
- 출력 결과의 알파값에 대한 속성입니다.
- bool값으로 지정할 수 있으며, false일 경우 입력 알파값이 보존되지 않으며, true일 경우 입력 알파값이 보존됩니다.
- 기본값은 false입니다.
D2D1_EDGEDETECTION_PROP_ALPHA_MODE
- 입력 이미지의 알파값 처리 방식에 대한 속성입니다.
- 알파값은 RGB값에 미리 적용되어 RGB로 표현될 수도, 따로 존재하여 RGBA값으로 표현될 수도 있습니다.
- 지정 가능한 값은 D2D1_ALPHA_MODE_{}의 값으로, UNKNOWN, PREMULTIPLIED, STRAIGHT, IGNORE이 있습니다.
- 기본값은 PREMULTIPLIED입니다.
위 값들은 기본 값이 있기 때문에, 코드에서 값을 지정하지 않아도 기본값을 통한 Edge detection이 수행됩니다.
D2D1_EDGEDETECTION_PROP(d2d1effects_2.h) - Win32 apps | Microsoft Learn
각각의 속성에 대한 상세한 내용은 상기 MSDN에 기술되어 있습니다.
3. 출력하기
더보기D2D Effect의 출력은 이전 글과 동일하게, DrawImage함수로 수행할 수 있습니다.
myDirect2dContext->DrawImage( edgeDetectionEffect.Get(), D2D1::Point2F(ps.x - 25.f, ps.y - 200.f)); // Add myDirect2dContext->DrawImage( edgeDetectionEffect2.Get(), D2D1::Point2F(ps.x - 25.f, ps.y - 70.f)); myDirect2dContext->DrawImage( edgeDetectionEffect3.Get(), D2D1::Point2F(ps.x - 25.f, ps.y + 60.f));
이전 글의 여러 출력에 대응하는 Edge detection을 추가로 출력했습니다.
본문의 내용을 따라, 이전 글에 이어서 Edge detection을 수행한 출력 결과는 다음과 같습니다.
해당 출력에 대한 코드 전문은 아래 Github에서 확인하실 수 있습니다.
GitHub - ruru14/WinapiStudy: WinAPI및 DirectX를 공부하며, 간단한 운동 법칙을 적용해봅니다.
WinAPI및 DirectX를 공부하며, 간단한 운동 법칙을 적용해봅니다. Contribute to ruru14/WinapiStudy development by creating an account on GitHub.
github.com
이번 글이 도움이 되셨기를 바랍니다.
감사합니다.
'C++ > 미분류' 카테고리의 다른 글
[Direct2D] 등속 운동, 등가속 운동, 중력 구현 (0) 2024.05.17 [Direct2D] ID2D1Effect : Chroma key (1) 2024.04.22 [Direct2D] ID2D1Effect : Color matrix (0) 2024.04.12 [Direct2D] ID2D1Effect : Affine transformation (0) 2024.04.09 [Direct2D] ID2D1Effect 사용하기 (0) 2024.04.05