-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path05_jpegls.ps1
More file actions
148 lines (121 loc) · 5.98 KB
/
05_jpegls.ps1
File metadata and controls
148 lines (121 loc) · 5.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# 05_jpegls.ps1 - JPEG-LS compression / decompression showcase
#
# Demonstrates dcmcjpls and dcmdjpls with the ABDOM CT test slices:
# 1. Lossless compress → decompress round-trip
# 2. Near-lossless compress → decompress round-trip
# 3. Batch compress all test files
# 4. Verify round-trip integrity by comparing dcmdump output
#
# Usage: pwsh -File 05_jpegls.ps1
[CmdletBinding()] param()
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$Root = Resolve-Path (Join-Path $ScriptDir '..\..')
$Ext = if (($env:OS -eq 'Windows_NT') -or ((Test-Path variable:IsWindows) -and $IsWindows)) { '.exe' } else { '' }
$Cjpls = Join-Path $Root "target\debug\dcmcjpls$Ext"
$Djpls = Join-Path $Root "target\debug\dcmdjpls$Ext"
$Dump = Join-Path $Root "target\debug\dcmdump$Ext"
$Files = Join-Path $ScriptDir '..\testfiles'
foreach ($b in @($Cjpls, $Djpls, $Dump)) {
if (-not (Test-Path $b)) {
Write-Error "Binary not found: $b`nRun: cargo build --bins"
}
}
$TmpDir = Join-Path ([System.IO.Path]::GetTempPath()) "dcmtk-jpegls-demo"
if (Test-Path $TmpDir) { Remove-Item -Recurse -Force $TmpDir }
New-Item -ItemType Directory -Path $TmpDir | Out-Null
$DCM = Join-Path $Files 'ABDOM_1.dcm'
function Banner($text) {
Write-Host ""
Write-Host ("=" * 60) -ForegroundColor Cyan
Write-Host " $text" -ForegroundColor Cyan
Write-Host ("=" * 60) -ForegroundColor Cyan
}
function FileSize($path) {
(Get-Item $path).Length
}
try {
# ── 1. Lossless round-trip ────────────────────────────────────────────────────
Banner "1. Lossless JPEG-LS round-trip"
$compLossless = Join-Path $TmpDir 'compressed_lossless.dcm'
$rtLossless = Join-Path $TmpDir 'roundtrip_lossless.dcm'
Write-Host " Compressing: ABDOM_1.dcm -> compressed_lossless.dcm"
& $Cjpls -v $DCM $compLossless
Write-Host ""
Write-Host " Decompressing: compressed_lossless.dcm -> roundtrip_lossless.dcm"
& $Djpls -v $compLossless $rtLossless
Write-Host ""
Write-Host " File sizes:"
$origSize = FileSize $DCM
$compSize = FileSize $compLossless
$rtSize = FileSize $rtLossless
Write-Host " Original: $origSize bytes"
Write-Host " Compressed: $compSize bytes"
Write-Host " Round-trip: $rtSize bytes"
# Show transfer syntax from dumps
Write-Host ""
Write-Host " Transfer syntax of each file:"
$tsOrig = (& $Dump --meta $DCM 2>$null | Select-String '\(0002,0010\)' | Select-Object -First 1).ToString().Trim()
$tsComp = (& $Dump --meta $compLossless 2>$null | Select-String '\(0002,0010\)' | Select-Object -First 1).ToString().Trim()
$tsRt = (& $Dump --meta $rtLossless 2>$null | Select-String '\(0002,0010\)' | Select-Object -First 1).ToString().Trim()
Write-Host " Original: $tsOrig"
Write-Host " Compressed: $tsComp"
Write-Host " Round-trip: $tsRt"
# ── 2. Near-lossless ──────────────────────────────────────────────────────────
Banner "2. Near-lossless JPEG-LS (max deviation = 3)"
$compLossy = Join-Path $TmpDir 'compressed_lossy.dcm'
$rtLossy = Join-Path $TmpDir 'roundtrip_lossy.dcm'
Write-Host " Compressing: ABDOM_1.dcm -> compressed_lossy.dcm"
& $Cjpls -v -n 3 $DCM $compLossy
Write-Host ""
Write-Host " Decompressing: compressed_lossy.dcm -> roundtrip_lossy.dcm"
& $Djpls -v $compLossy $rtLossy
Write-Host ""
$lossySize = FileSize $compLossy
Write-Host " File sizes:"
Write-Host " Original: $origSize bytes"
Write-Host " Lossy compressed: $lossySize bytes"
Write-Host " Lossless compressed: $compSize bytes"
# ── 3. Batch lossless compress ────────────────────────────────────────────────
Banner "3. Batch lossless compress all 5 ABDOM slices"
$batchDir = Join-Path $TmpDir 'batch'
New-Item -ItemType Directory -Path $batchDir | Out-Null
foreach ($f in Get-ChildItem (Join-Path $Files 'ABDOM_*.dcm')) {
$outPath = Join-Path $batchDir $f.Name
& $Cjpls $f.FullName $outPath
$oSize = $f.Length
$cSize = (Get-Item $outPath).Length
if ($cSize -gt 0) {
$ratio = [math]::Round($oSize / $cSize, 1)
} else {
$ratio = '?'
}
Write-Host " $($f.Name): $oSize -> $cSize bytes (${ratio}:1)"
}
# ── 4. Batch decompress + verify ─────────────────────────────────────────────
Banner "4. Batch decompress -> verify metadata preserved"
$roundtripDir = Join-Path $TmpDir 'roundtrip'
New-Item -ItemType Directory -Path $roundtripDir | Out-Null
foreach ($f in Get-ChildItem (Join-Path $batchDir 'ABDOM_*.dcm')) {
$outPath = Join-Path $roundtripDir $f.Name
& $Djpls $f.FullName $outPath
$origPatient = (& $Dump (Join-Path $Files $f.Name) 2>$null | Select-String '\(0010,0010\)' | Select-Object -First 1)
$rtPatient = (& $Dump $outPath 2>$null | Select-String '\(0010,0010\)' | Select-Object -First 1)
if ($origPatient -and $rtPatient -and $origPatient.ToString() -eq $rtPatient.ToString()) {
Write-Host " $($f.Name): metadata preserved" -ForegroundColor Green
} else {
Write-Host " $($f.Name): WARNING - metadata differs" -ForegroundColor Yellow
}
}
# ── 5. Dump compressed file structure ─────────────────────────────────────────
Banner "5. Dump compressed file structure"
Write-Host " Showing metadata header of JPEG-LS compressed file:"
& $Dump --meta $compLossless 2>$null | Select-Object -First 30 | ForEach-Object { Write-Host " $_" }
Write-Host " ..."
Write-Host ""
Write-Host "Done - all JPEG-LS demos complete" -ForegroundColor Green
} finally {
# Cleanup temp directory
if (Test-Path $TmpDir) { Remove-Item -Recurse -Force $TmpDir }
}