BLENDFUNCTION structure

BLENDFUNCTION structure

BLENDFUNCTION 구조체는 원본과 대상 비트맵에 대한 블렌딩 함수를 상세하여 블렌딩을 제어합니다.

 

멤버

BlendOp
원본 블렌드 연산. 현재 정의되어 있는 원본과 대상 블렌드 옵션은 AC_SRC_OVER 뿐입니다. 자세한 사항은 알아둘 점을 보기 바랍니다.
BlendFlags
이어야 합니다.
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 값이 다음 표와 같이 블렌드를 결정하게 됩니다. SCASourceConstantAlpha 를 나타냅니다. 또, 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

Leave a Reply