Private/Merge-PxLayer.ps1

function Merge-PxLayer {
    <#
    .SYNOPSIS
        Composites multiple pixel layers into final RGBA data.
    
    .PARAMETER Layers
        Array of byte arrays, each containing RGBA data for one layer.
    
    .PARAMETER Width
        Image width in pixels.
    
    .PARAMETER Height
        Image height in pixels.
    
    .OUTPUTS
        System.Array of RGBA pixel arrays.
    #>

    [CmdletBinding()]
    [OutputType([byte[][]])]
    param(
        [Parameter(Mandatory)]
        [byte[][]]$Layers,
        
        [Parameter(Mandatory)]
        [int]$Width,
        
        [Parameter(Mandatory)]
        [int]$Height
    )
    
    $pixelCount = $Width * $Height
    $pixels = [System.Collections.Generic.List[byte[]]]::new($pixelCount)
    
    if ($Layers.Count -eq 1) {
        $layer = $Layers[0]
        for ($i = 0; $i -lt $pixelCount; $i++) {
            $idx = $i * 4
            $r = $layer[$idx]
            $g = $layer[$idx + 1]
            $b = $layer[$idx + 2]
            $a = $layer[$idx + 3]
            
            $pixels.Add([byte[]]@($r, $g, $b, $a))
        }
    } else {
        # Composite layers from bottom to top
        # Start with bottom layer (last in array) and work upward
        for ($i = 0; $i -lt $pixelCount; $i++) {
            $idx = $i * 4
            
            # Start with bottom layer
            $bottomLayer = $Layers[$Layers.Count - 1]
            $r = $bottomLayer[$idx]
            $g = $bottomLayer[$idx + 1]
            $b = $bottomLayer[$idx + 2]
            $a = $bottomLayer[$idx + 3]
            
            # Composite each layer on top from bottom to top
            for ($li = $Layers.Count - 2; $li -ge 0; $li--) {
                $layer = $Layers[$li]
                $lr = $layer[$idx]
                $lg = $layer[$idx + 1]
                $lb = $layer[$idx + 2]
                $la = $layer[$idx + 3]
                
                # Composite if top layer has opacity (even if it's black)
                if ($la -gt 0) {
                    $r = $lr
                    $g = $lg
                    $b = $lb
                    $a = $la
                }
            }
            
            $pixels.Add([byte[]]@($r, $g, $b, $a))
        }
    }
    
    return $pixels.ToArray()
}