Win32 API 日本語リファレンス
ホームMedia.Streaming › HistogramHeader

HistogramHeader

構造体
サイズx64: 40 バイト / x86: 40 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
SizeDWORD4+0+0このヘッダーのサイズ + (HistogramDataHeader + それに続くヒストグラム データ) * 利用可能なチャネル数。
BinsDWORD4+4+4ヒストグラムのビンの数。
FourCCDWORD4+8+8ヒストグラムの収集元となる色空間。
ChannelMasksDWORD4+12+12ヒストグラムの収集対象となる色チャネルのマスク。
GridHistogramGrid24+16+16ヒストグラムの収集元となるグリッド。

公式ドキュメント

HistogramHeader 構造体は、MF_CAPTURE_METADATA_HISTOGRAM のブロブ形式を記述します。

解説(Remarks)

MF_CAPTURE_METADATA_HISTOGRAM 属性には、プレビュー フレームがキャプチャされたときのヒストグラムが含まれます。

ChannelMasks フィールドでは、次のビットマスクがヒストグラムで利用可能なチャネルを示します。

#define MF_HISTOGRAM_CHANNEL_Y  0x00000001
#define MF_HISTOGRAM_CHANNEL_R  0x00000002
#define MF_HISTOGRAM_CHANNEL_G  0x00000004
#define MF_HISTOGRAM_CHANNEL_B  0x00000008
#define MF_HISTOGRAM_CHANNEL_Cb 0x00000010
#define MF_HISTOGRAM_CHANNEL_Cr 0x00000020

各ブロブには、同一フレームの異なる領域または異なる色空間から収集された複数のヒストグラムを含めることができます。ブロブ内の各ヒストグラムは、それぞれの HistogramHeader によって識別されます。各ヒストグラムには、それぞれ固有の領域とセンサー出力サイズが関連付けられています。フル フレームのヒストグラムの場合、領域は HistogramGrid で指定されたセンサー出力サイズと一致します。

利用可能なすべてのチャネルのヒストグラム データは、1 つのヒストグラムの下にまとめられます。各チャネルのヒストグラム データは、データの直前に置かれる HistogramDataHeader によって識別されます。ChannelMasks は、ヒストグラム データを持つチャネルの数と種類を示すもので、上で定義したサポート対象の MF_HISTOGRAM_CHANNEL_* ビットマスクのビット単位のORです。ChannelMask は、そのデータがどのチャネルのものかを示すもので、MF_HISTOGRAM_CHANNEL_* ビットマスクのいずれか 1 つで識別されます。

ヒストグラム データは ULONG の配列で、各エントリは、ビンによって分類された階調値の範囲に該当するピクセル数を表します。配列内のデータはビン 0 からビン N-1 まで順に格納します。ここで N はヒストグラムのビンの数 (例: HistogramBlobHeader.Bins) です。

Windows 10 では、KSPROPERTY_CAMERACONTROL_EXTENDED_HISTOGRAM がサポートされている場合、少なくとも Y チャネルのフル フレーム ヒストグラムを提供しなければならず、それがヒストグラム ブロブ内の最初のヒストグラムである必要があります。 HistogramBlobHeaderHistogramHeaderHistogramDataHeader およびヒストグラム データは、MF_CAPTURE_METADATA_HISTOGRAM 属性のブロブ形式を記述するものにすぎない点に注意してください。ヒストグラムのメタデータ項目構造 (KSCAMERA_METADATA_ITEMHEADER + すべてのヒストグラム メタデータ ペイロード) はドライバーに委ねられており、8 バイト境界に整列されていなければなりません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// RECT  (x64 16 / x86 16 バイト)
typedef struct RECT {
    INT left;
    INT top;
    INT right;
    INT bottom;
} RECT;

// HistogramGrid  (x64 24 / x86 24 バイト)
typedef struct HistogramGrid {
    DWORD Width;
    DWORD Height;
    RECT Region;
} HistogramGrid;

// HistogramHeader  (x64 40 / x86 40 バイト)
typedef struct HistogramHeader {
    DWORD Size;
    DWORD Bins;
    DWORD FourCC;
    DWORD ChannelMasks;
    HistogramGrid Grid;
} HistogramHeader;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct HistogramGrid
{
    public uint Width;
    public uint Height;
    public RECT Region;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct HistogramHeader
{
    public uint Size;
    public uint Bins;
    public uint FourCC;
    public uint ChannelMasks;
    public HistogramGrid Grid;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RECT
    Public left As Integer
    Public top As Integer
    Public right As Integer
    Public bottom As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure HistogramGrid
    Public Width As UInteger
    Public Height As UInteger
    Public Region As RECT
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure HistogramHeader
    Public Size As UInteger
    Public Bins As UInteger
    Public FourCC As UInteger
    Public ChannelMasks As UInteger
    Public Grid As HistogramGrid
End Structure
import ctypes
from ctypes import wintypes

class RECT(ctypes.Structure):
    _fields_ = [
        ("left", ctypes.c_int),
        ("top", ctypes.c_int),
        ("right", ctypes.c_int),
        ("bottom", ctypes.c_int),
    ]

class HistogramGrid(ctypes.Structure):
    _fields_ = [
        ("Width", wintypes.DWORD),
        ("Height", wintypes.DWORD),
        ("Region", RECT),
    ]

class HistogramHeader(ctypes.Structure):
    _fields_ = [
        ("Size", wintypes.DWORD),
        ("Bins", wintypes.DWORD),
        ("FourCC", wintypes.DWORD),
        ("ChannelMasks", wintypes.DWORD),
        ("Grid", HistogramGrid),
    ]
#[repr(C)]
pub struct RECT {
    pub left: i32,
    pub top: i32,
    pub right: i32,
    pub bottom: i32,
}

#[repr(C)]
pub struct HistogramGrid {
    pub Width: u32,
    pub Height: u32,
    pub Region: RECT,
}

#[repr(C)]
pub struct HistogramHeader {
    pub Size: u32,
    pub Bins: u32,
    pub FourCC: u32,
    pub ChannelMasks: u32,
    pub Grid: HistogramGrid,
}
import "golang.org/x/sys/windows"

type RECT struct {
	left int32
	top int32
	right int32
	bottom int32
}

type HistogramGrid struct {
	Width uint32
	Height uint32
	Region RECT
}

type HistogramHeader struct {
	Size uint32
	Bins uint32
	FourCC uint32
	ChannelMasks uint32
	Grid HistogramGrid
}
type
  RECT = record
    left: Integer;
    top: Integer;
    right: Integer;
    bottom: Integer;
  end;

  HistogramGrid = record
    Width: DWORD;
    Height: DWORD;
    Region: RECT;
  end;

  HistogramHeader = record
    Size: DWORD;
    Bins: DWORD;
    FourCC: DWORD;
    ChannelMasks: DWORD;
    Grid: HistogramGrid;
  end;
const RECT = extern struct {
    left: i32,
    top: i32,
    right: i32,
    bottom: i32,
};

const HistogramGrid = extern struct {
    Width: u32,
    Height: u32,
    Region: RECT,
};

const HistogramHeader = extern struct {
    Size: u32,
    Bins: u32,
    FourCC: u32,
    ChannelMasks: u32,
    Grid: HistogramGrid,
};
type
  RECT {.bycopy.} = object
    left: int32
    top: int32
    right: int32
    bottom: int32

  HistogramGrid {.bycopy.} = object
    Width: uint32
    Height: uint32
    Region: RECT

  HistogramHeader {.bycopy.} = object
    Size: uint32
    Bins: uint32
    FourCC: uint32
    ChannelMasks: uint32
    Grid: HistogramGrid
struct RECT
{
    int left;
    int top;
    int right;
    int bottom;
}

struct HistogramGrid
{
    uint Width;
    uint Height;
    RECT Region;
}

struct HistogramHeader
{
    uint Size;
    uint Bins;
    uint FourCC;
    uint ChannelMasks;
    HistogramGrid Grid;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; HistogramHeader サイズ: 40 バイト(x64)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; Size : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Bins : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; FourCC : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; ChannelMasks : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; Grid : HistogramGrid (+16, 24byte)  varptr(st)+16 を基点に操作(24byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global RECT
    #field int left
    #field int top
    #field int right
    #field int bottom
#endstruct

#defstruct global HistogramGrid
    #field int Width
    #field int Height
    #field RECT Region
#endstruct

#defstruct global HistogramHeader
    #field int Size
    #field int Bins
    #field int FourCC
    #field int ChannelMasks
    #field HistogramGrid Grid
#endstruct

stdim st, HistogramHeader        ; NSTRUCT 変数を確保
st->Size = 100
mes "Size=" + st->Size