package edu.mbl.jif.imagej; import ij.ImagePlus; import ij.io.FileSaver; import ij.io.Opener; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.*; // Don't know where I got this... // See readme below. public class ImageConversion { // 8-bit unsigned integer (0-255). public static final int GRAY8 = 0; // 16-bit signed integer (-32768-32767). Imported signed images are converted to unsigned by adding 32768. public static final int GRAY16_SIGNED = 1; // 16-bit unsigned integer (0-65535). public static final int GRAY16_UNSIGNED = 2; // 32-bit signed integer. Imported 32-bit integer images are converted to floating-point. public static final int GRAY32_INT = 3; // 32-bit floating-point. public static final int GRAY32_FLOAT = 4; // 8-bit unsigned integer with color lookup table. public static final int COLOR8 = 5; // 24-bit interleaved RGB. Import/export only. public static final int RGB = 6; // 24-bit planer RGB. Import only. public static final int RGB_PLANAR = 7; // 1-bit black and white. Import only. public static final int BITMAP = 8; // 32-bit interleaved ARGB. Import only. public static final int ARGB = 9; // 24-bit interleaved BGR. Import only. public static final int BGR = 10; // 32-bit unsigned integer. Imported 32-bit integer images are converted to floating-point. public static final int GRAY32_UNSIGNED = 11; public void batchConvert(String srcDirectory, String outDirectory, String outFormat) { String[] list = new File(srcDirectory).list(); boolean isSuccess = false; if (list == null) return; for (int i = 0; i < list.length; i++) { String filename = list[i]; File f = new File(srcDirectory + "\\" + filename); if (!f.isDirectory()) { String outFileName = filename.substring(0, filename.lastIndexOf(".")) + "." + outFormat; //File outFile = new File(outDirectory + "\\" + outFileName); isSuccess = convertImage(filename, outFileName, outFormat); System.out.println("isSuccess: " + isSuccess); } } } public boolean convertImage(String inFileName, String outFileName, String outFormat) { boolean isSuccess = false; BufferedImage bi = null; File outputFile = new File(outFileName); // Get extension from a File object String ext = inFileName.substring(inFileName.lastIndexOf('.') + 1); if (canReadExtension(ext)) { try { //System.out.println("Image IO can read the File:"); bi = ImageIO.read(new File(inFileName)); bi.flush(); } catch (java.io.IOException e) { } } else { try { Opener o = new Opener(); ImagePlus imp = o.openImage(inFileName); //System.out.println("Info: " + imp.getProperty("Info")); bi = new BufferedImage(imp.getWidth(), imp.getHeight(), getType(imp)); Graphics g = bi.createGraphics(); g.drawImage(imp.getImage(), 0, 0, null); g.dispose(); imp.flush(); bi.flush(); } catch (NullPointerException e) { isSuccess = false; e.printStackTrace(); return isSuccess; } } if (canWriteFormat(outFormat)) { try { isSuccess = ImageIO.write(bi, outFormat, outputFile); } catch (java.io.IOException e) { } finally { } } else { FileSaver fs = new FileSaver(new ImagePlus("title", bi)); if (outFormat.equalsIgnoreCase("jpeg")) fs.saveAsJpeg(outputFile.toString()); if (outFormat.equalsIgnoreCase("tiff")) fs.saveAsTiff(outputFile.toString()); isSuccess = false; } System.out.println("isSuccess: " + isSuccess); return isSuccess; } //Returns true if the specified file extension can be read public static boolean canReadExtension(String fileExt) { Iterator iter = ImageIO.getImageReadersBySuffix(fileExt); return iter.hasNext(); } // Returns true if the specified format name can be written public static boolean canWriteFormat(String formatName) { Iterator iter = ImageIO.getImageWritersByFormatName(formatName); return iter.hasNext(); } public static void printReadFormats() { String[] formatNames = ImageIO.getReaderFormatNames(); formatNames = unique(formatNames); for (int i = 0; i < formatNames.length; i++) System.out.println(formatNames[i]); } public static void printWriteFormats() { String[] formatNames = ImageIO.getWriterFormatNames(); formatNames = unique(formatNames); for (int i = 0; i < formatNames.length; i++) System.out.println(formatNames[i]); } public static String[] unique(String[] strings) { Set set = new HashSet(); for (int i = 0; i < strings.length; i++) { String name = strings[i].toLowerCase(); set.add(name); } return (String[]) set.toArray(new String[0]); } // Returns an integer corresponding to the TYPE of BufferedImage private int getType(ImagePlus imp) { if (imp == null) return -1; // try { // switch (imp.getFileInfo().getFileType()) { // case GRAY8: // return BufferedImage.TYPE_BYTE_GRAY; // case GRAY16_SIGNED: // return BufferedImage.TYPE_USHORT_GRAY; // case GRAY16_UNSIGNED: // return BufferedImage.TYPE_USHORT_GRAY; // case GRAY32_INT: // return BufferedImage.TYPE_INT_RGB; // case GRAY32_UNSIGNED: // return BufferedImage.TYPE_INT_RGB; // case GRAY32_FLOAT: // return BufferedImage.TYPE_INT_RGB; // case COLOR8: // return BufferedImage.TYPE_INT_RGB; // case RGB: // return BufferedImage.TYPE_INT_RGB; // case RGB_PLANAR: // return BufferedImage.TYPE_INT_RGB; // case BITMAP: // return BufferedImage.TYPE_INT_RGB; // case ARGB: // return BufferedImage.TYPE_INT_ARGB; // case BGR: // return BufferedImage.TYPE_INT_BGR; // default: // return 1; // } // } catch (Exception e) { // System.out.println("Exception caught::DicomConverter::getType"); // } return -1; } // Creates the Medatadata hashtable using the keystring provided protected Hashtable getMetaData(ImagePlus imp, String keys) { if (imp == null) { return null; } StringTokenizer st = new StringTokenizer(keys, "|"); ArrayList hashtableKeys = new ArrayList(); ArrayList dicomKeys = new ArrayList(); while (st.hasMoreTokens()) { hashtableKeys.add(st.nextToken()); if (!st.hasMoreTokens()) dicomKeys.add(null); else dicomKeys.add(st.nextToken()); } // Gets the metadata as a string by invoking method on ImagePlus object. String s = (String) imp.getProperty("Info"); System.out.println("Info: " + imp.getProperty("Info")); Hashtable ImageMetaData = new Hashtable(); for (int i = 0; i < hashtableKeys.size(); i++) { try { String value = s.substring(s.indexOf(dicomKeys.get(i).toString())); ImageMetaData.put(hashtableKeys.get(i).toString(), value.substring(value.indexOf(": ") + 2, value.indexOf("\n")).trim()); } catch (StringIndexOutOfBoundsException e) { if (hashtableKeys.get(i) != null) ImageMetaData.put(hashtableKeys.get(i).toString(), ""); } } return ImageMetaData; } public static void main(String[] args) { //printReadFormats(); //printWriteFormats(); ImageConversion ic = new ImageConversion(); //ic.convertImage("C:\\programs\\Projects\\jdjImage\\input\\image1.dcm", "C:\\programs\\Projects\\jdjImage\\output\\image1.jpg", "jpeg-lossless"); ic.convertImage(args[0],args[1],args[2]); } } /* 1. Unzip all files in a directory say C:\temp\jdj 2. Download JAI Image I/O Tools from http://java.sun.com/products/java-media/jai/downloads/download-iio.html. 3. Extract all jar files and dll files in the same directory (say C:\temp\jdj) 4. Only following jar/dll files are needed to be present in the same directory: i) clibwrapper_jiio.jar ii) jai_imageio.jar iii) mlibwrapper_jai.jar iv) clib_jiio.dll V) ij.jar 2. Run run.bat, you need jdk1.4 or higher 3. To change the input files and output format edit run.bat's following command: java -Dlibrary=. ImageConversion image1.dcm image2.jpg jpeg2000 to java -Dlibrary=. ImageConversion yourInputfileName yourOutputFileName yourFormat The available output formats are: tif,tiff,jfif,wbmp,jpeg-lossless,jpeg2000,raw,bmp,jpeg,jpeg 2000,jpeg-ls,pnm,png,jpg */