BLENDFUNCTION structure
BLENDFUNCTION 구조체는 원본과 대상 비트맵에 대한 블렌딩 함수를 상세하여 블렌딩을 제어합니다.
1 2 3 4 5 6 |
typedef struct _BLENDFUNCTION { BYTE BlendOp; BYTE BlendFlags; BYTE SourceConstantAlpha; BYTE AlphaFormat; } BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION; |
멤버
- BlendOp
- 원본 블렌드 연산. 현재 정의되어 있는 원본과 대상 블렌드 옵션은 AC_SRC_OVER 뿐입니다. 자세한 사항은 알아둘 점을 보기 바랍니다.
- BlendFlags
- 0이어야 합니다.
- SourceConstantAlpha
- 전체 원본 비트맵에 사용될 알파 투명화 값을 상세합니다. SourceConstantAlpha 값은 원본 비트맵의 어떤 픽셀 당 알파값과 조합하여 사용할 수 있습니다. SourceConstantAlpha 가 0일때, 이미지는 투명한 것으로 볼 수 있습니다. 픽셀당 알파값만을 사용하고 싶다면 SourceConstantAlpha 값을 255(불투명)으로 설정합니다.
- AlphaFormat
- 이 멤버는 원본과 대상 비트맵이 해석되는 방법을 조정합니다. AlphaFormat 은 다음 값을 갖습니다.
값 의미 AC_SRC_ALPHA 이 플래그는 비트맵이 알파 채널이 있을 때 설정 됩니다. (여기서 알파는 픽셀 당 알파 값을 의미합니다.) API는 미리 곱해진 알파값을 사용하므로 적색, 녹색, 청색 채널의 값들은 미리 알마 채널의 값과 곱해져 있어야 합니다. 예를 들어 알파 채널 값이 x라면 적색, 녹색, 청색 채널은 x로 곱해진 뒤 0xff로 나뉘어야 합니다.
알아둘 점
AlphaFormat 멤버가 AC_SRC_ALPHA이면 원본 비트맵은 32bpp여야 합니다. 아닌 경우 AlphaBlend 함수는 실패하게 됩니다.
BlendOp 멤버가 AC_SRC_OVER 라면 원본 비트맵은 원본 픽셀의 알파 값에 따라 대상 비트맵 위에 올려집니다.
원본 비트맵이 픽셀 당 알파값이 없는 경우( AC_SRC_ALPHA 가 설정되지 않은 경우) SourceConstantAlpha 값이 다음 표와 같이 블렌드를 결정하게 됩니다. SCA 는 SourceConstantAlpha 를 나타냅니다. 또, SCA 는 255로 나누어지는데 0에서 255 사이의 값을 가지기 때문입니다.
Dst.Red | = Src.Red * (SCA/255.0) | + Dst.Red * (1.0 – (SCA/255.0)) |
Dst.Green | = Src.Green * (SCA/255.0) | + Dst.Green * (1.0 – (SCA/255.0)) |
Dst.Blue | = Src.Blue * (SCA/255.0) | + Dst.Blue * (1.0 – (SCA/255.0)) |
대상 비트맵이 알파 채널을 갖고 있다면 블렌드는 다음과 같이 이루어집니다.
Dst.Alpha | = Src.Alpha * (SCA/255.0) | + Dst.Alpha * (1.0 – (SCA/255.0)) |
원본 비트맵이 SourceConstantAlpha 를 사용하지 않는다면(값이 0xFF라면), 픽셀 당 알파값은 다음 표와 같이 원본과 대상 비트맵의 블렌드로 결정됩니다.
Dst.Red | = Src.Red | + (1 – Src.Alpha) * Dst.Red |
Dst.Green | = Src.Green | + (1 – Src.Alpha) * Dst.Green |
Dst.Blue | = Src.Blue | + (1 – Src.Alpha) * Dst.Blue |
만약 대상 비트맵이 알파 채널이 있다면 다음과 같이 블렌드 됩니다.
Dest.alpha | = Src.Alpha | + (1 – SrcAlpha) * Dst.Alpha |
원본이 SourceConstantAlpha (0xFF이 아닌 값인) 와 픽셀 당 알파값을 가지고 있는 경우 원본은 미리 SourceConstantAlpha 가 곱해지고 난 뒤 픽셀 당 알파값이 적용됩니다. 이는 다음 표와 같습니다. SourceConstantAlpha 가 0에서 255 사이의 값을 가지므로 255로 나뉜 것에 유의하기 바랍니다.
Src.Red | = Src.Red | * SourceConstantAlpha / 255.0; |
Src.Green | = Src.Green | * SourceConstantAlpha / 255.0; |
Src.Blue | = Src.Blue | * SourceConstantAlpha / 255.0; |
Src.Alpha | = Src.Alpha | * SourceConstantAlpha / 255.0; |
Dst.Red | = Src.Red | + (1 – Src.Alpha) * Dst.Red |
Dst.Green | = Src.Green | + (1 – Src.Alpha) * Dst.Green |
Dst.Blue | = Src.Blue | + (1 – Src.Alpha) * Dst.Blue |
Dst.Alpha | = Src.Alpha | + (1 – Src.Alpha) * Dst.Alpha |