package org.hipi.test; import static org.junit.Assert.*; import static org.junit.Assume.*; import org.hipi.image.HipiImage; import org.hipi.image.RasterImage; import org.hipi.image.ByteImage; import org.hipi.image.FloatImage; import org.hipi.image.PixelArrayByte; import org.hipi.image.PixelArrayFloat; import org.hipi.image.PixelArray; import org.hipi.image.HipiImageFactory; import org.hipi.image.HipiImageHeader; import org.hipi.image.io.ImageDecoder; import org.hipi.image.io.ImageEncoder; import org.hipi.image.io.JpegCodec; import org.hipi.image.io.PpmCodec; import org.hipi.util.ByteUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.ArrayUtils; import org.junit.Test; import org.junit.Ignore; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.Raster; import java.awt.image.ColorConvertOp; import java.awt.color.ColorSpace; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; public class PpmCodecTestCase { @Test public void testTwelveMonkeysPlugIn() { boolean foundTwelveMonkeys = false; Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("PPM"); while (readers.hasNext()) { ImageReader imageReader = readers.next(); // System.out.println("ImageReader: " + imageReader); if (imageReader.toString().startsWith("com.twelvemonkeys.imageio.plugins.pnm")) { foundTwelveMonkeys = true; } } assertTrue("FATAL ERROR: failed to locate TwelveMonkeys ImageIO plugins", foundTwelveMonkeys); } @Ignore @Test public void testEncodeImage() throws IOException { ImageDecoder ppmDecoder = PpmCodec.getInstance(); ImageEncoder jpegEncoder = JpegCodec.getInstance(); // File[] cmykFiles = new File("./testimages/jpeg-cmyk").listFiles(); // File[] rgbFiles = new File("./testimages/jpeg-rgb").listFiles(); // File[] files = (File[])ArrayUtils.addAll(cmykFiles,rgbFiles); File[] files = new File("./testdata/jpeg-rgb").listFiles(); // Tests PPM decode and JPEG encode routines using ByteImage for (File file : files) { if (file.isFile() && file.getName().endsWith("_photoshop.ppm")) { String ppmPath = file.getPath(); String jpgPath = "/tmp/hipi_enc.jpg"; System.out.println("Testing JPEG encoder (ByteImage) for: " + ppmPath); ByteImage image = (ByteImage)ppmDecoder.decodeHeaderAndImage(new FileInputStream(ppmPath), HipiImageFactory.getByteImageFactory(), false); jpegEncoder.encodeImage(image, new FileOutputStream(jpgPath)); Runtime rt = Runtime.getRuntime(); String cmd = "compare -metric PSNR " + ppmPath + " " + jpgPath + " /tmp/psnr.png"; System.out.println("cmd: " + cmd); Process pr = rt.exec(cmd); Scanner scanner = new Scanner(new InputStreamReader(pr.getErrorStream())); float psnr = scanner.hasNextFloat() ? scanner.nextFloat() : 0; System.out.println("PSNR: " + psnr); assertTrue(ppmPath + " PSNR is too low : " + psnr, psnr > 30); } } // Tests PPM decode and JPEG encode routines using FloatImage for (File file : files) { if (file.isFile() && file.getName().endsWith("_photoshop.ppm")) { String ppmPath = file.getPath(); String jpgPath = "/tmp/hipi_enc.jpg"; System.out.println("Testing JPEG encoder (FloatImage) for: " + ppmPath); FloatImage image = (FloatImage)ppmDecoder.decodeHeaderAndImage(new FileInputStream(ppmPath), HipiImageFactory.getFloatImageFactory(), false); jpegEncoder.encodeImage(image, new FileOutputStream(jpgPath)); Runtime rt = Runtime.getRuntime(); String cmd = "compare -metric PSNR " + ppmPath + " " + jpgPath + " /tmp/psnr.png"; System.out.println("cmd: " + cmd); Process pr = rt.exec(cmd); Scanner scanner = new Scanner(new InputStreamReader(pr.getErrorStream())); float psnr = scanner.hasNextFloat() ? scanner.nextFloat() : 0; System.out.println("PSNR: " + psnr); assertTrue(ppmPath + " PSNR is too low : " + psnr, psnr > 30); } } } }