Skip to content
Commits on Source (2)
path=.;.\lib\additional;%path%
java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\pixelmed_codec.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.apps.DeidentifyAndRedact %1 %2 %3
java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.apps.DeidentifyAndRedact %1 %2 %3
pause
......@@ -5,10 +5,9 @@ dst="$2"
shapes="$3"
PIXELMEDDIR=.
PIXELMEDCODECDIR=${HOME}/work/codec
java -Xmx1g -Xms1g -Djava.awt.headless=true \
-cp "${PIXELMEDDIR}/pixelmed.jar:${PIXELMEDCODECDIR}/pixelmed_codec.jar:${PIXELMEDDIR}/lib/additional/commons-compress-1.9.jar:${PIXELMEDDIR}/lib/additional/commons-codec-1.3.jar:${PIXELMEDDIR}/lib/additional/jai_imageio.jar" \
-cp "${PIXELMEDDIR}/pixelmed.jar:${PIXELMEDDIR}/lib/additional/pixelmed_imageio.jar:${PIXELMEDDIR}/lib/additional/commons-compress-1.9.jar:${PIXELMEDDIR}/lib/additional/commons-codec-1.3.jar:${PIXELMEDDIR}/lib/additional/jai_imageio.jar" \
com.pixelmed.apps.DeidentifyAndRedact \
"${src}" \
"${dst}" \
......
path=.;.\lib\additional;%path%
java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\pixelmed_codec.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.apps.DeidentifyAndRedactWithOriginalFileName %1 %2 %3
java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.apps.DeidentifyAndRedactWithOriginalFileName %1 %2 %3
pause
......@@ -4,4 +4,4 @@ dicomdirfile="$*"
PIXELMEDDIR=.
java -Xmx512m -Xms512m -cp "${PIXELMEDDIR}/pixelmed.jar:${PIXELMEDDIR}/lib/additional/hsqldb.jar:${PIXELMEDDIR}/lib/additional/commons-compress-1.9.jar:${PIXELMEDDIR}/lib/additional/vecmath1.2-1.14.jar:${PIXELMEDDIR}/lib/additional/jmdns.jar:${PIXELMEDDIR}/lib/additional/commons-codec-1.3.jar:${PIXELMEDDIR}/lib/additional/jai_imageio.jar" com.pixelmed.display.DicomBrowser "${dicomdirfile}"
java -Xmx512m -Xms512m -cp "${PIXELMEDDIR}/pixelmed.jar:${PIXELMEDDIR}/lib/additional/pixelmed_imageio.jar:${PIXELMEDDIR}/lib/additional/hsqldb.jar:${PIXELMEDDIR}/lib/additional/commons-compress-1.9.jar:${PIXELMEDDIR}/lib/additional/vecmath1.2-1.14.jar:${PIXELMEDDIR}/lib/additional/jmdns.jar:${PIXELMEDDIR}/lib/additional/commons-codec-1.3.jar:${PIXELMEDDIR}/lib/additional/jai_imageio.jar" com.pixelmed.display.DicomBrowser "${dicomdirfile}"
path=.;.\lib\additional;.\windows\lib;%path%
java -Xms256m -Xmx768m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_codec.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar;.\windows\lib\clibwrapper_jiio.jar;.\windows\lib\jai_imageio.jar" com.pixelmed.display.DicomCleaner
java -Xms256m -Xmx768m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar;.\windows\lib\clibwrapper_jiio.jar;.\windows\lib\jai_imageio.jar" com.pixelmed.display.DicomCleaner
pause
path=.;.\lib\additional;%path%
.\windows\jre\bin\java -Xms256m -Xmx512m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_codec.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar" com.pixelmed.display.DicomCleaner
.\windows\jre\bin\java -Xms256m -Xmx512m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar" com.pixelmed.display.DicomCleaner
pause
path=.;.\lib\additional;%path%
java -Xmx768m -Xms768m -cp ".\pixelmed.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.display.DicomImageViewer
java -Xmx768m -Xms768m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.display.DicomImageViewer
pause
......@@ -4,4 +4,4 @@ dicomfile="$*"
PIXELMEDDIR=.
java -Xmx512m -Xms512m -cp "${PIXELMEDDIR}/pixelmed.jar:${PIXELMEDDIR}/lib/additional/hsqldb.jar:${PIXELMEDDIR}/lib/additional/commons-compress-1.9.jar:${PIXELMEDDIR}/lib/additional/vecmath1.2-1.14.jar:${PIXELMEDDIR}/lib/additional/jmdns.jar:${PIXELMEDDIR}/lib/additional/commons-codec-1.3.jar:${PIXELMEDDIR}/lib/additional/jai_imageio.jar" com.pixelmed.display.DicomImageViewer "${dicomfile}"
java -Xmx512m -Xms512m -cp "${PIXELMEDDIR}/pixelmed.jar:${PIXELMEDDIR}/lib/additional/pixelmed_imageio.jar:${PIXELMEDDIR}/lib/additional/hsqldb.jar:${PIXELMEDDIR}/lib/additional/commons-compress-1.9.jar:${PIXELMEDDIR}/lib/additional/vecmath1.2-1.14.jar:${PIXELMEDDIR}/lib/additional/jmdns.jar:${PIXELMEDDIR}/lib/additional/commons-codec-1.3.jar:${PIXELMEDDIR}/lib/additional/jai_imageio.jar" com.pixelmed.display.DicomImageViewer "${dicomfile}"
path=.;.\lib\additional;%path%
.\windows\jre\bin\java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.display.DicomImageViewer .\dicomdir
.\windows\jre\bin\java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar;.\lib\additional\jai_imageio.jar;.\lib\additional\clibwrapper_jiio.jar" com.pixelmed.display.DicomImageViewer .\dicomdir
pause
path=.;.\lib\additional;%path%
.\windows\jre\bin\java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar" com.pixelmed.display.DicomImageViewer .\dicomdir
.\windows\jre\bin\java -Xmx384m -Xms384m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\jmdns.jar" com.pixelmed.display.DicomImageViewer .\dicomdir
pause
path=.;.\lib\additional;.\windows\lib;%path%
java -Xms256m -Xmx768m -Xss1m -cp ".\pixelmed.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\commons-net-ftp-2.0.jar;.\lib\additional\jmdns.jar;.\windows\lib\clibwrapper_jiio.jar;.\windows\lib\jai_imageio.jar" com.pixelmed.apps.DoseUtility
java -Xms256m -Xmx768m -Xss1m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\commons-net-ftp-2.0.jar;.\lib\additional\jmdns.jar;.\windows\lib\clibwrapper_jiio.jar;.\windows\lib\jai_imageio.jar" com.pixelmed.apps.DoseUtility
pause
path=.;.\lib\additional;%path%
.\windows\jre\bin\java -Xms256m -Xmx512m -Xss1m -cp ".\pixelmed.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\commons-net-ftp-2.0.jar;.\lib\additional\jmdns.jar" com.pixelmed.apps.DoseUtility
.\windows\jre\bin\java -Xms256m -Xmx512m -Xss1m -cp ".\pixelmed.jar;.\lib\additional\pixelmed_imageio.jar;.\lib\additional\hsqldb.jar;.\lib\additional\commons-compress-1.9.jar;.\lib\additional\vecmath1.2-1.14.jar;.\lib\additional\commons-codec-1.3.jar;.\lib\additional\commons-net-ftp-2.0.jar;.\lib\additional\jmdns.jar" com.pixelmed.apps.DoseUtility
pause
......@@ -302,6 +302,7 @@ MACAPPRELEASEFILES = \
DicomImageViewer.app/Contents/PkgInfo \
DicomImageViewer.app/Contents/Resources/DicomImageViewer.icns \
DicomImageViewer.app/Contents/Java/pixelmed.jar \
DicomImageViewer.app/Contents/Java/pixelmed_imageio.jar \
DicomImageViewer.app/Contents/Java/hsqldb.jar \
DicomImageViewer.app/Contents/Java/commons-compress-1.9.jar \
DicomImageViewer.app/Contents/Java/vecmath1.2-1.14.jar \
......@@ -317,11 +318,13 @@ MACAPPRELEASEFILES = \
DicomCleaner.app/Contents/Java/hsqldb.jar \
DicomCleaner.app/Contents/Java/jmdns.jar \
DicomCleaner.app/Contents/Java/pixelmed.jar \
DicomCleaner.app/Contents/Java/pixelmed_imageio.jar \
DoseUtility.app/Contents/Info.plist \
DoseUtility.app/Contents/MacOS/JavaAppLauncher \
DoseUtility.app/Contents/PkgInfo \
DoseUtility.app/Contents/Resources/DoseUtility.icns \
DoseUtility.app/Contents/Java/pixelmed.jar \
DoseUtility.app/Contents/Java/pixelmed_imageio.jar \
DoseUtility.app/Contents/Java/hsqldb.jar \
DoseUtility.app/Contents/Java/commons-compress-1.9.jar \
DoseUtility.app/Contents/Java/commons-codec-1.3.jar \
......@@ -602,6 +605,7 @@ ECGViewer_app: \
ECGViewer.app/Contents/Java/pixelmed.jar \
ECGViewer.app/Contents/Java/commons-codec-1.3.jar \
ECGViewer.app/Contents/MacOS/JavaAppLauncher
rm -rf $${HOME}/Applications/ECGViewer.app
cp -r ECGViewer.app $${HOME}/Applications/
ECGViewer.app/Contents/Java/pixelmed.jar: pixelmed.jar
......@@ -619,6 +623,7 @@ ECGViewer.app/Contents/MacOS/JavaAppLauncher:
DicomImageViewer_app: \
DicomImageViewer.app/Contents/Java/pixelmed.jar \
DicomImageViewer.app/Contents/Java/pixelmed_imageio.jar \
DicomImageViewer.app/Contents/Java/hsqldb.jar \
DicomImageViewer.app/Contents/Java/commons-compress-1.9.jar \
DicomImageViewer.app/Contents/Java/vecmath1.2-1.14.jar \
......@@ -627,12 +632,17 @@ DicomImageViewer_app: \
DicomImageViewer.app/Contents/Java/jmdns.jar \
DicomImageViewer.app/Contents/Resources/DicomImageViewer.icns \
DicomImageViewer.app/Contents/MacOS/JavaAppLauncher
rm -rf $${HOME}/Applications/DicomImageViewer.app
cp -r DicomImageViewer.app $${HOME}/Applications/
DicomImageViewer.app/Contents/Java/pixelmed.jar: pixelmed.jar
mkdir -p DicomImageViewer.app/Contents/Java
cp $< $@
DicomImageViewer.app/Contents/Java/pixelmed_imageio.jar: lib/additional/pixelmed_imageio.jar
mkdir -p DicomImageViewer.app/Contents/Java
cp $< $@
DicomImageViewer.app/Contents/Java/hsqldb.jar: lib/additional/hsqldb.jar
mkdir -p DicomImageViewer.app/Contents/Java
cp $< $@
......@@ -668,7 +678,7 @@ DicomImageViewer.app/Contents/MacOS/JavaAppLauncher:
DicomCleaner_app: \
DicomCleaner.app/Contents/Java/pixelmed.jar \
DicomCleaner.app/Contents/Java/pixelmed_codec.jar \
DicomCleaner.app/Contents/Java/pixelmed_imageio.jar \
DicomCleaner.app/Contents/Java/hsqldb.jar \
DicomCleaner.app/Contents/Java/commons-compress-1.9.jar \
DicomCleaner.app/Contents/Java/commons-codec-1.3.jar \
......@@ -676,13 +686,14 @@ DicomCleaner_app: \
DicomCleaner.app/Contents/Java/jai_imageio.jar \
DicomCleaner.app/Contents/Resources/DicomCleaner.icns \
DicomCleaner.app/Contents/MacOS/JavaAppLauncher
rm -rf $${HOME}/Applications/DicomCleaner.app
cp -r DicomCleaner.app $${HOME}/Applications/
DicomCleaner.app/Contents/Java/pixelmed.jar: pixelmed.jar
mkdir -p DicomCleaner.app/Contents/Java
cp $< $@
DicomCleaner.app/Contents/Java/pixelmed_codec.jar: lib/additional/pixelmed_codec.jar
DicomCleaner.app/Contents/Java/pixelmed_imageio.jar: lib/additional/pixelmed_imageio.jar
mkdir -p DicomCleaner.app/Contents/Java
cp $< $@
......@@ -717,6 +728,7 @@ DicomCleaner.app/Contents/MacOS/JavaAppLauncher:
DoseUtility_app: \
DoseUtility.app/Contents/Java/pixelmed.jar \
DoseUtility.app/Contents/Java/pixelmed_imageio.jar \
DoseUtility.app/Contents/Java/hsqldb.jar \
DoseUtility.app/Contents/Java/commons-compress-1.9.jar \
DoseUtility.app/Contents/Java/commons-codec-1.3.jar \
......@@ -725,12 +737,17 @@ DoseUtility_app: \
DoseUtility.app/Contents/Java/jai_imageio.jar \
DoseUtility.app/Contents/Resources/DoseUtility.icns \
DoseUtility.app/Contents/MacOS/JavaAppLauncher
rm -rf $${HOME}/Applications/DoseUtility.app
cp -r DoseUtility.app $${HOME}/Applications/
DoseUtility.app/Contents/Java/pixelmed.jar: pixelmed.jar
mkdir -p DoseUtility.app/Contents/Java
cp $< $@
DoseUtility.app/Contents/Java/pixelmed_imageio.jar: lib/additional/pixelmed_imageio.jar
mkdir -p DoseUtility.app/Contents/Java
cp $< $@
DoseUtility.app/Contents/Java/hsqldb.jar: lib/additional/hsqldb.jar
mkdir -p DoseUtility.app/Contents/Java
cp $< $@
......
......@@ -49,6 +49,9 @@ SERVERADDITIONALJARS = ${VIEWERADDITIONALJARS}
#JPEGBLOCKREDACTIONJAR = $${HOME}/work/codec/pixelmed_codec.jar
JPEGBLOCKREDACTIONJAR = ${PATHTOADDITIONAL}/pixelmed_codec.jar
#PIXELMEDIMAGEIOJAR = $${HOME}/work/codec/pixelmed_imageio.jar
PIXELMEDIMAGEIOJAR = ${PATHTOADDITIONAL}/pixelmed_imageio.jar
JAVAVERSIONTARGET=1.7
JAVACTARGETOPTIONS=-target ${JAVAVERSIONTARGET} -source ${JAVAVERSIONTARGET} -bootclasspath $${JAVAVERSIONTARGETJARFILE}
......
......@@ -184,7 +184,8 @@ System.err.println("Processing "+dicomFileName+" Transfer Syntax "+inputTransfer
for (int f=0; f<frames.length; ++f) {
ByteArrayInputStream fbis = new ByteArrayInputStream(frames[f]);
ByteArrayOutputStream fbos = new ByteArrayOutputStream();
com.pixelmed.codec.jpeg.Parse.parse(fbis,fbos,redactionShapes);
//todo edited by k1
// com.pixelmed.codec.jpeg.Parse.parse(fbis,fbos,redactionShapes);
frames[f] = fbos.toByteArray(); // hmmm :(
}
}
......
......@@ -19,7 +19,7 @@ import java.io.FileInputStream;
* @author dclunie
*/
public class AttributeFactory {
private static final String identString = "@(#) $Header: /userland/cvs/pixelmed/imgbook/com/pixelmed/dicom/AttributeFactory.java,v 1.30 2015/09/17 21:42:08 dclunie Exp $";
private static final String identString = "@(#) $Header: /userland/cvs/pixelmed/imgbook/com/pixelmed/dicom/AttributeFactory.java,v 1.31 2015/09/18 19:56:58 dclunie Exp $";
private static final long maximumInMemoryOtherDataValueLength = 4096*4096*2; // set to -1l to never leave on disk, 0 to always leave on disk
//private static final long maximumInMemoryOtherDataValueLength = 0; // set to -1l to never leave on disk, 0 to always leave on disk
......@@ -88,6 +88,9 @@ public class AttributeFactory {
else if (ValueRepresentation.isOtherFloatVR(vr)) {
c=OtherFloatAttribute.class;
}
else if (ValueRepresentation.isOtherLongVR(vr)) {
c=OtherLongAttribute.class;
}
else if (ValueRepresentation.isOtherWordVR(vr)) {
// This is not quite right ... in implicit VR, pixel data is always OW theoretically,
// but this saves later unpacking ... and works as long is implicit VR is little endian
......
......@@ -168,7 +168,7 @@ import java.util.zip.*;
public class AttributeList extends TreeMap<AttributeTag,Attribute> {
/***/
private static final String identString = "@(#) $Header: /userland/cvs/pixelmed/imgbook/com/pixelmed/dicom/AttributeList.java,v 1.165 2015/08/27 11:14:00 dclunie Exp $";
private static final String identString = "@(#) $Header: /userland/cvs/pixelmed/imgbook/com/pixelmed/dicom/AttributeList.java,v 1.169 2015/11/06 23:44:30 dclunie Exp $";
private static final long badAttributeLimit = 10; // pretty arbitrary, but avoids very long wait on large non-DICOM files, and still permits the occasional bad ones
......@@ -225,8 +225,6 @@ public class AttributeList extends TreeMap<AttributeTag,Attribute> {
// otherwise can be as large as it needs to be
}
private static boolean haveScannedForCodecs;
protected boolean decompressPixelData = true; // NOT static ... must be explicitly set to false for each instance constructed !
/**
......@@ -594,7 +592,8 @@ System.err.println("AttributeList.read(): "+tag+" encountered incorrect Implicit
else {
vl=i.readUnsigned16(); // reserved bytes
byteOffset+=2;
if (vl == 0) {
if (vl == 0
|| vl == 0x3030) { // handle reserved bytes incorrectly set to ASCII zero characters, not zero :) ! (000872)
vl=i.readUnsigned32();
byteOffset+=4;
}
......@@ -659,6 +658,8 @@ System.err.println("AttributeList.read(): "+tag+" encountered incorrect short Va
byteOffset+=vl;
}
else if (vl == 0xffffffffl && tag.equals(TagFromName.PixelData)/* && i.getTransferSyntaxInUse().isEncapsulated()*/) { // assume encapsulated in case TS is not recognized
//boolean unencapsulatePixelData = ???; // incomplete experiments with deferring not just decompression, but also unencapsulation
//if (unencapsulatePixelData) {
int wordsPerFrame = rows*columns*samplesPerPixel;
//System.err.println("Undefined length encapsulated Pixel Data: words per frame "+wordsPerFrame);
TransferSyntax ts = i.getTransferSyntaxInUse();
......@@ -669,7 +670,7 @@ System.err.println("AttributeList.read(): "+tag+" encountered incorrect short Va
// when constructing EncapsulatedInputStream, take care whether or not to enable JPEG EOI detection to allow fragment spanning, and if not, whether to use one fragment per frame or all fragments in one frame
EncapsulatedInputStream ei = new EncapsulatedInputStream(i,isJPEGFamily,isRLE);
if (decompressPixelData) {
//System.err.println("AttributeList.read(): Decompress Pixel Data");
System.err.println("AttributeList.read(): Decompress Pixel Data");
if (tsuid.equals(TransferSyntax.PixelMedEncapsulatedRawLittleEndian)) {
if (bytesPerSample == 1) {
byte[] values = new byte[wordsPerFrame*frames];
......@@ -889,72 +890,11 @@ System.err.println("AttributeList.read(): "+tag+" encountered incorrect short Va
}
}
else {
if (!haveScannedForCodecs) {
//System.err.println("AttributeList.read(): Scanning for ImageIO plugin codecs");
ImageIO.scanForPlugins();
haveScannedForCodecs=true;
}
CompressedFrameDecoder.scanForCodecs();
pixelDataWasActuallyDecompressed = true;
System.err.println("Based on Transfer Syntax, colorSpaceWillBeConvertedToRGBDuringDecompression = "+colorSpaceWillBeConvertedToRGBDuringDecompression);
if (readerWanted != null) {
ImageReader reader = null;
ImageReaderSpi readerSpi = null;
String readerDescription = null;
String readerVendorName = null;
String readerVersion = null;
// Do NOT assume that first reader found is the best one ... check them all and make explicit choices ...
//try {
Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(readerWanted);
while (it.hasNext()) {
if (reader == null) {
reader = it.next();
readerSpi = reader.getOriginatingProvider();
readerDescription = readerSpi.getDescription(Locale.US);
readerVendorName = readerSpi.getVendorName();
readerVersion = readerSpi.getVersion();
//System.err.println("First reader found is "+readerDescription+" "+readerVendorName+" "+readerVersion);
}
else {
ImageReader otherReader = it.next();
ImageReaderSpi otherReaderSpi = otherReader.getOriginatingProvider();
String otherReaderDescription = otherReaderSpi.getDescription(Locale.US);
String otherReaderVendorName = otherReaderSpi.getVendorName();
String otherReaderVersion = otherReaderSpi.getVersion();
//System.err.println("Found another reader "+otherReaderDescription+" "+otherReaderVendorName+" "+otherReaderVersion);
if (readerDescription.equals("Standard JPEG Image Reader") && (readerVendorName.equals("Sun Microsystems, Inc.") || readerVendorName.equals("Oracle Corporation"))) {
// prefer any other reader to the standard one, since the standard one is limited, and any other is most likely JAI JIIO
reader = otherReader;
readerSpi = otherReaderSpi;
readerDescription = otherReaderDescription;
readerVendorName = otherReaderVendorName;
readerVersion = otherReaderVersion;
//System.err.println("Choosing reader from "+readerDescription+" "+readerVendorName+" "+readerVersion+" over Standard JPEG Image Reader");
}
}
}
if (reader != null) {
// The JAI JIIO JPEG reader is OK since it handles both 8 and 12 bit JPEGExtended, but the "standard" reader that comes with the JRE only supports 8 bit
// Arguably 8 bits in JPEGExtended is not valid (PS3.5 10.2) but since it is sometimes encountered, deal with it if we can, else throw specific exception ...
if (tsuid.equals(TransferSyntax.JPEGExtended) && bytesPerSample > 1 && readerDescription.equals("Standard JPEG Image Reader") && (readerVendorName.equals("Sun Microsystems, Inc.") || readerVendorName.equals("Oracle Corporation"))) {
throw new DicomException("Reader "+readerDescription+" "+readerVendorName+" "+readerVersion+" does not support extended lossy JPEG Transfer Syntax "+tsuid+" other than for 8 bit data");
}
System.err.println("Using reader from "+readerDescription+" "+readerVendorName+" "+readerVersion);
//OurIIOReadProgressListener progressListener = new OurIIOReadProgressListener();
//reader.addIIOReadProgressListener(progressListener);
//System.err.println("Back from reader.addIIOReadProgressListener()");
}
else {
//CapabilitiesAvailable.dumpListOfAllAvailableReaders(System.err);
throw new DicomException("No reader for "+readerWanted+" available for Transfer Syntax "+tsuid);
}
//}
//catch (Exception e) {
// e.printStackTrace(System.err);
// CapabilitiesAvailable.dumpListOfAllAvailableReaders(System.err);
// throw new DicomException("No reader for "+readerWanted+" available for Transfer Syntax "+tsuid+"\nCaused by: "+e);
//}
ImageReader reader = CompressedFrameDecoder.selectReaderFromCodecsAvailable(readerWanted,tsuid,bytesPerSample);
if (reader != null) {
byte[] bytePixelData = null; // lazy instantiation of one or the other
short[] shortPixelData = null;
......@@ -969,9 +909,9 @@ System.err.println("Using reader from "+readerDescription+" "+readerVendorName+"
for (int f=0; f<frames; ++f) {
//System.err.println("Starting frame "+f);
ImageInputStream iiois = ImageIO.createImageInputStream(ei);
//reader.reset(); // NB. will also remove listeners, which we aren't using ... not strictly necessary if following setInput() actually removes anything cached, as it is supposed to
reader.setInput(iiois,true/*seekForwardOnly*/,true/*ignoreMetadata*/);
//System.err.println("Calling reader.readAll()");
//System.err.println("AttributeList.read(): Calling reader.readAll()");
IIOImage iioImage = null;
try {
iioImage = reader.readAll(0,null/*ImageReadParam*/);
......@@ -979,14 +919,14 @@ System.err.println("Using reader from "+readerDescription+" "+readerVendorName+"
catch (IIOException e) {
e.printStackTrace(System.err);
//System.err.println("\""+e.toString()+"\"");
if (tsuid.equals(TransferSyntax.JPEGBaseline) && readerDescription.equals("Standard JPEG Image Reader") && (readerVendorName.equals("Sun Microsystems, Inc.") || readerVendorName.equals("Oracle Corporation"))
if (tsuid.equals(TransferSyntax.JPEGBaseline) && reader.getOriginatingProvider().getDescription(Locale.US).equals("Standard JPEG Image Reader") && (reader.getOriginatingProvider().getVendorName().equals("Sun Microsystems, Inc.") || reader.getOriginatingProvider().getVendorName().equals("Oracle Corporation"))
&& e.toString().equals("javax.imageio.IIOException: Inconsistent metadata read from stream")) {
throw new DicomException("Reader "+readerDescription+" "+readerVendorName+" "+readerVersion+" does not support JPEG images with components numbered from 0");
throw new DicomException("Reader "+reader.getOriginatingProvider().getDescription(Locale.US)+" "+reader.getOriginatingProvider().getVendorName()+" "+reader.getOriginatingProvider().getVersion()+" does not support JPEG images with components numbered from 0");
}
}
//System.err.println("Back from frame reader.readAll()");
if (iioImage == null) {
throw new DicomException("Reader "+readerDescription+" "+readerVendorName+" "+readerVersion
throw new DicomException("Reader "+reader.getOriginatingProvider().getDescription(Locale.US)+" "+reader.getOriginatingProvider().getVendorName()+" "+reader.getOriginatingProvider().getVersion()
+" returned null image for Transfer Syntax "+tsuid);
}
else {
......@@ -994,7 +934,7 @@ System.err.println("Using reader from "+readerDescription+" "+readerVendorName+"
BufferedImage image = (BufferedImage)(iioImage.getRenderedImage());
//System.err.println("Back from frame "+f+" reader.read(), BufferedImage="+image);
if (image == null) {
throw new DicomException("Reader "+readerDescription+" "+readerVendorName+" "+readerVersion
throw new DicomException("Reader "+reader.getOriginatingProvider().getDescription(Locale.US)+" "+reader.getOriginatingProvider().getVendorName()+" "+reader.getOriginatingProvider().getVersion()
+" returned null image for Transfer Syntax "+tsuid);
}
Raster raster = image.getData();
......@@ -1080,6 +1020,7 @@ System.err.println("colorSpaceWasConvertedToRGBDuringDecompression = "+colorSpac
}
else {
//System.err.println("AttributeList.read(): Do not decompress Pixel Data");
//long startReadCompressedBytesTime = System.currentTimeMillis();
if (ei.framesAreSeparated()) { // e.g., JPEG or RLE
//System.err.println("AttributeList.read(): frames are separated in encapsulated input");
byte[][] frameArray = new byte[frames][];
......@@ -1155,6 +1096,7 @@ System.err.println("colorSpaceWasConvertedToRGBDuringDecompression = "+colorSpac
}
doneReadingEncapsulatedData=true;
pixelDataWasActuallyDecompressed = false;
//System.err.println("AttributeList.read(): read of compressed bytes into buffers done in "+(System.currentTimeMillis()-startReadCompressedBytesTime)+" ms");
}
if (!doneReadingEncapsulatedData) {
//System.err.println("Skipping encapsulated pixel data");
......@@ -1172,6 +1114,32 @@ System.err.println("colorSpaceWasConvertedToRGBDuringDecompression = "+colorSpac
}
}
//System.err.println("Done with encapsulated pixel data");
// }
// else {
//System.err.println("AttributeList.read(): Do not unencapsulate or decompress Pixel Data");
//long startSkipEncapsulatedBytesTime = System.currentTimeMillis();
// long startOffset = byteOffset;
// boolean sequenceDelimiterEncountered = false;
// while (!sequenceDelimiterEncountered) {
// // follows pattern of EncapsulatedInputStream.readItemTag() but updates local byteOffset
// AttributeTag itemTag = readAttributeTag(i);
// byteOffset+=4;
// long itemLength = i.readUnsigned32(); // always implicit VR form for items and delimiters
// byteOffset+=4;
// if (itemTag.equals(TagFromName.SequenceDelimitationItem)) {
// sequenceDelimiterEncountered = true;
// }
// else if (!itemTag.equals(TagFromName.Item)) {
// throw new IOException("Unexpected DICOM tag "+itemTag+" (vl="+itemLength+") in encapsulated data whilst expecting Item or SequenceDelimitationItem");
// }
// else {
// i.skipInsistently(itemLength);
// byteOffset+=itemLength;
// }
// }
//System.err.println("AttributeList.read(): skip of encapsulated bytes done in "+(System.currentTimeMillis()-startSkipEncapsulatedBytesTime)+" ms");
// a = new OtherByteAttributeOnDisk(TagFromName.PixelData,byteOffset-startOffset+1,i,startOffset); // this will not work if data is actually read - haven't written necessary class to hold encapsulated data yet :(
// }
}
if (a != null) {
......
......@@ -18,7 +18,7 @@ import java.util.Date; // for test timing of routines
public class BinaryInputStream extends FilterInputStream {
/***/
private static final String identString = "@(#) $Header: /userland/cvs/pixelmed/imgbook/com/pixelmed/dicom/BinaryInputStream.java,v 1.20 2015/03/17 23:10:59 dclunie Exp $";
private static final String identString = "@(#) $Header: /userland/cvs/pixelmed/imgbook/com/pixelmed/dicom/BinaryInputStream.java,v 1.21 2015/09/18 19:56:58 dclunie Exp $";
/***/
boolean bigEndian;
......@@ -350,6 +350,64 @@ public class BinaryInputStream extends FilterInputStream {
//System.err.println("readUnsigned16: exit at: "+(new Date().getTime()-starttime)+" ms");
}
/**
* <p>Read an array of unsigned integer 32 bit values.</p>
*
* @param w an array of sufficient size in which to return the values read
* @param len the number of 32 bit values to read
* @throws IOException if an I/O error occurs
*/
public final void readUnsigned32(int[] w,int len) throws IOException {
readUnsigned32(w,0,len);
}
/**
* <p>Read an array of unsigned integer 32 bit values.</p>
*
* @param w an array of sufficient size in which to return the values read
* @param offset the offset in the array at which to begin storing values
* @param len the number of 32 bit values to read
* @throws IOException if an I/O error occurs
*/
public final void readUnsigned32(int[] w,int offset,int len) throws IOException {
//long starttime=new Date().getTime();
//for (int i=offset; i<len; ++i) w[i]=(short)readUnsigned32(); // naive approach is slower :(
// allocating and reading all bytes into byte[] runs into int length limit four times as early (as well as transiently requiring ludicrous amount of memory)
// compromise by reading in blocks ... this actually turns out to be yet faster than reading entire byte array
byte[] byteBuffer = new byte[BYTE_BUFFER_SIZE];
int shortsRemaining = len;
long bytesRemaining = ((long)len) * 4;
while (shortsRemaining > 0) {
int bytesToRead = byteBuffer.length;
if (bytesRemaining < bytesToRead) {
bytesToRead = (int)bytesRemaining;
}
readInsistently(byteBuffer,0,bytesToRead);
{
int bcount=0;
if (bigEndian) {
while (bcount<bytesToRead) {
w[offset++]=((byteBuffer[bcount++]<<24)&0xff000000) + ((byteBuffer[bcount++]<<16)&0x00ff0000) + ((byteBuffer[bcount++]<<8)&0x0000ff00) + (byteBuffer[bcount++]&0xff); // assumes left to right evaluation
}
}
else {
while (bcount<bytesToRead) {
w[offset++]=(byteBuffer[bcount++]&0xff) + ((byteBuffer[bcount++]<<8)&0x0000ff00) + ((byteBuffer[bcount++]<<16)&0x00ff0000) + ((byteBuffer[bcount++]<<24)&0xff000000); // assumes left to right evaluation
}
}
}
bytesRemaining-=bytesToRead;
shortsRemaining-=(bytesToRead/2);
}
//System.err.println("readUnsigned32: exit at: "+(new Date().getTime()-starttime)+" ms");
}
/**
* <p>Read an array of floating point 32 bit values.</p>
*
......