BLENDFUNCTION
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||
|---|---|---|---|---|---|---|---|---|---|
| BlendOp | BYTE | 1 | +0 | +0 | 転送元のブレンド操作です。現在のところ、定義されている転送元および転送先のブレンド操作は AC_SRC_OVER のみです。詳細については、後述の「解説」セクションを参照してください。 | ||||
| BlendFlags | BYTE | 1 | +1 | +1 | 0 でなければなりません。 | ||||
| SourceConstantAlpha | BYTE | 1 | +2 | +2 | 転送元ビットマップ全体に適用されるアルファ透明度の値を指定します。SourceConstantAlpha の値は、転送元ビットマップのピクセルごとのアルファ値と組み合わされます。SourceConstantAlpha に 0 を設定した場合、画像は透明であるとみなされます。ピクセルごとのアルファ値のみを使用したい場合は、SourceConstantAlpha の値を 255 (不透明) に設定してください。 | ||||
| AlphaFormat | BYTE | 1 | +3 | +3 | このメンバーは、転送元ビットマップと転送先ビットマップの解釈方法を制御します。AlphaFormat には次の値を指定できます。
|
公式ドキュメント
BLENDFUNCTION 構造体は、転送元ビットマップと転送先ビットマップのブレンド関数を指定することで、ブレンド処理を制御します。
解説(Remarks)
AlphaFormat メンバーが AC_SRC_ALPHA の場合、転送元ビットマップは 32 bpp でなければなりません。そうでない場合、AlphaBlend 関数は失敗します。
BlendOp メンバーが AC_SRC_OVER の場合、転送元ピクセルのアルファ値に基づいて、転送元ビットマップが転送先ビットマップの上に重ねられます。
転送元ビットマップがピクセルごとのアルファ値を持たない場合 (つまり AC_SRC_ALPHA が設定されていない場合)、次の表に示すように、SourceConstantAlpha の値によって転送元ビットマップと転送先ビットマップのブレンドが決定されます。ここでは SourceConstantAlpha を SCA と表記しています。また、SCA は 0 から 255 の範囲の値を取るため、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 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// BLENDFUNCTION (x64 4 / x86 4 バイト)
typedef struct BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
} BLENDFUNCTION;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure BLENDFUNCTION
Public BlendOp As Byte
Public BlendFlags As Byte
Public SourceConstantAlpha As Byte
Public AlphaFormat As Byte
End Structureimport ctypes
from ctypes import wintypes
class BLENDFUNCTION(ctypes.Structure):
_fields_ = [
("BlendOp", ctypes.c_ubyte),
("BlendFlags", ctypes.c_ubyte),
("SourceConstantAlpha", ctypes.c_ubyte),
("AlphaFormat", ctypes.c_ubyte),
]#[repr(C)]
pub struct BLENDFUNCTION {
pub BlendOp: u8,
pub BlendFlags: u8,
pub SourceConstantAlpha: u8,
pub AlphaFormat: u8,
}import "golang.org/x/sys/windows"
type BLENDFUNCTION struct {
BlendOp byte
BlendFlags byte
SourceConstantAlpha byte
AlphaFormat byte
}type
BLENDFUNCTION = record
BlendOp: Byte;
BlendFlags: Byte;
SourceConstantAlpha: Byte;
AlphaFormat: Byte;
end;const BLENDFUNCTION = extern struct {
BlendOp: u8,
BlendFlags: u8,
SourceConstantAlpha: u8,
AlphaFormat: u8,
};type
BLENDFUNCTION {.bycopy.} = object
BlendOp: uint8
BlendFlags: uint8
SourceConstantAlpha: uint8
AlphaFormat: uint8struct BLENDFUNCTION
{
ubyte BlendOp;
ubyte BlendFlags;
ubyte SourceConstantAlpha;
ubyte AlphaFormat;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; BLENDFUNCTION サイズ: 4 バイト(x64)
dim st, 1 ; 4byte整数×1(構造体サイズ 4 / 4 切り上げ)
; BlendOp : BYTE (+0, 1byte) poke st,0,値 / 値 = peek(st,0)
; BlendFlags : BYTE (+1, 1byte) poke st,1,値 / 値 = peek(st,1)
; SourceConstantAlpha : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; AlphaFormat : BYTE (+3, 1byte) poke st,3,値 / 値 = peek(st,3)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global BLENDFUNCTION
#field byte BlendOp
#field byte BlendFlags
#field byte SourceConstantAlpha
#field byte AlphaFormat
#endstruct
stdim st, BLENDFUNCTION ; NSTRUCT 変数を確保
st->BlendOp = 100
mes "BlendOp=" + st->BlendOp