/usr/bin/dcunrgb is in dicom3tools 1.00~20140105-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 | #!/bin/sh
# usage: dcunrgb infile outfile
#
TMPROOT=/tmp/`basename $0`.$$
ANCREATE=ancreate
DC=dc
DCCP=dccp
DCDUMP=dcdump
DCTOPNM=dctopnm
DCKEY=dckey
PNMTORAW=pnmtoraw
PPMTOPGM=ppmtopgm
dccpoptions=" -nodisclaimer -noadddicom -ignorereaderrors -ignoreoutofordertags"
if [ ! -f "$1" ]
then
echo 1>&2 "Input file does not exist - $1"
exit 1
fi
transfersyntaxuid=`"$DCKEY" -noerror -ignorereaderrors -ignoreoutofordertags -k TransferSyntaxUID "$1" 2>&1 | egrep -v 'Error|Warning'`
if [ "$transfersyntaxuid" != "1.2.840.10008.1.2" -a "$transfersyntaxuid" != "1.2.840.10008.1.2.1" -a "$transfersyntaxuid" != "1.2.840.10008.1.2.2" ]
then
echo 1>&2 "Only uncompressed RGB 8 bit per pixel input supported"
exit 1
fi
bits=`"$DCKEY" -noerror -ignorereaderrors -ignoreoutofordertags -decimal -k BitsAllocated "$1" 2>&1 | egrep -v 'Error|Warning'`
if [ $bits -ne 8 ]
then
echo 1>&2 "Only uncompressed RGB 8 bit per pixel input supported"
exit 1
fi
samplesperpixel=`"$DCKEY" -noerror -ignorereaderrors -ignoreoutofordertags -decimal -k SamplesPerPixel "$1" 2>&1 | egrep -v 'Error|Warning'`
if [ $samplesperpixel -ne 3 ]
then
echo 1>&2 "Only uncompressed RGB 8 bit per pixel input supported"
exit 1
fi
rows=`"$DCKEY" -noerror -ignorereaderrors -ignoreoutofordertags -decimal -k Rows "$1" 2>&1 | egrep -v 'Error|Warning'`
columns=`"$DCKEY" -noerror -ignorereaderrors -ignoreoutofordertags -decimal -k Columns "$1" 2>&1 | egrep -v 'Error|Warning'`
frames=`"$DCKEY" -noerror -ignorereaderrors -ignoreoutofordertags -decimal -k NumberOfFrames "$1" 2>&1 | egrep -v 'Error|Warning'`
if [ -z "$frames" ]; then frames=1; fi
#echo 1>&2 "rows=$rows"
#echo 1>&2 "columns=$columns"
#echo 1>&2 "frames=$frames"
#numberOfPixels may be odd
numberOfPixels=`$DC <<EOF
16
o
$rows
$columns
$frames
*
*
p
EOF`
#echo 1>&2 "numberOfPixels(hex)=$numberOfPixels"
# VL is rounded up to next even number if odd ...
vl=`$DC <<EOF
16
o
$rows
$columns
$frames
*
*
1
+
2
/
2
*
p
EOF`
#echo 1>&2 "vl(hex)=$vl"
#isOdd will be 0 if even, 1 if odd
isOdd=`$DC <<EOF
16
i
$vl
$numberOfPixels
-
p
EOF`
#echo 1>&2 "isOdd=$isOdd"
echo "(0x7fe0,0x0010) OX Pixel Data VR=<OB> VL=<0x$vl> []" | "$ANCREATE" -e > "$TMPROOT.pixelhead"
"$DCTOPNM" -quiet "$1" "$TMPROOT.ppm"
# Note that ppmtopgm is documented (“http://netpbm.sourceforge.net/doc/ppmtopgm.html”) to use “gray = .299 r + .587 g + .114 b” as the conversion formula
# (NTSC luminance weighting “http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC11”), but the net effect
# is to produce the same value of gray when r, g and b are the same value
"$PPMTOPGM" "$TMPROOT.ppm" > "$TMPROOT.pgm"
rm "$TMPROOT.ppm"
"$PNMTORAW" "$TMPROOT.pgm" > "$TMPROOT.raw"
rm "$TMPROOT.pgm"
"$DCCP" "$1" "$TMPROOT.nopixels" -d PixelData -d DataSetTrailingPadding -d DigitalSignaturesSequence $dccpoptions -r PhotometricInterpretation MONOCHROME2 -r SamplesPerPixel 1 -d PlanarConfiguration
cat "$TMPROOT.nopixels" "$TMPROOT.pixelhead" "$TMPROOT.raw" > "$2"
if [ ${isOdd} = 1 ]
then
# add single padding byte to make even and match VL
dd if=/dev/zero bs=1 count=1 >>"$2" 2>/dev/null
fi
rm "$TMPROOT.nopixels" "$TMPROOT.pixelhead" "$TMPROOT.raw"
exit 0
|