/**
* Project: simpleimage-1.1 File Created at 2010-8-10 $Id$ Copyright 2008 Alibaba.com Croporation Limited. All rights
* reserved. This software is the confidential and proprietary information of Alibaba Company.
* ("Confidential Information"). You shall not disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into with Alibaba.com.
*/
package com.alibaba.simpleimage.codec.jpeg;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.io.File;
import java.io.FileInputStream;
import javax.imageio.ImageIO;
import junit.framework.TestCase;
import org.apache.commons.io.IOUtils;
import com.alibaba.simpleimage.ImageWrapper;
import com.alibaba.simpleimage.io.ImageInputStream;
import com.alibaba.simpleimage.io.ImageBitsInputStream;
/**
* @author wendell
*/
public class JPEGDecoderFunctionTest extends TestCase {
static File jpegs = new File("./src/test/resources/conf.test/simpleimage/codec/jpeg");
static int DIFF_VALUE = 10;
public void testColorCMYKProg() throws Exception {
// JAI JPEG image reader can't read progressive CMYK picture
// readAndCompare("color", "cmyk_prog.jpg");
}
public void testColorCMYKSeq() throws Exception {
// readAndCompare("color", "cmyk_seq.jpg", true);
}
public void testColorGrayProg() throws Exception {
readAndCompare("color", "gray_prog.jpg", false);
}
public void testColorGraySeq() throws Exception {
readAndCompare("color", "gray_seq.jpg", false);
}
public void testColorRGBProg() throws Exception {
readAndCompare("color", "rgb_prog.jpg", false);
}
public void testColorRGBSeq() throws Exception {
readAndCompare("color", "rgb_seq.jpg", false);
}
public void testColorBoundsWhite() throws Exception {
readAndCompare("color", "rgb_bounds_seq_white.jpg", false);
}
public void testColorBoundsColor() throws Exception {
readAndCompare("color", "rgb_bounds_seq_color.jpg", false);
}
public void testProgNoDRI() throws Exception {
readAndCompare("DRI", "prog_noDRI.jpg", false);
}
public void testSeqDRI() throws Exception {
readAndCompare("DRI", "seq_DRI.jpg", false);
}
public void testSeqNoDRI() throws Exception {
readAndCompare("DRI", "seq_noDRI.jpg", true);
}
public void testPrecision() throws Exception {
}
// public void testCMYKEmbedProfile() throws Exception {
// File profileDir = new File(jpegs, "profile");
// File img = new File(profileDir, "cmyk_embedprofile.jpg");
//
// ImageWrapper wi = getDecodedImage(img);
// assertTrue(wi.getExtendImageHeader().isExistProfile());
// }
// public void testCMYKNoProfile() throws Exception {
// File profileDir = new File(jpegs, "profile");
// File img = new File(profileDir, "cmyk_noprofile.jpg");
//
// ImageWrapper wi = getDecodedImage(img);
// assertFalse(wi.getExtendImageHeader().isExistProfile());
// }
//
// public void testRGBEmbedProfile() throws Exception {
// File profileDir = new File(jpegs, "profile");
// File img = new File(profileDir, "rgb_embedprofile.jpg");
//
// ImageWrapper wi = getDecodedImage(img);
// assertTrue(wi.getExtendImageHeader().isExistProfile());
// }
//
// public void testRGBNoProfile() throws Exception {
// File profileDir = new File(jpegs, "profile");
// File img = new File(profileDir, "rgb_noprofile.jpg");
//
// ImageWrapper wi = getDecodedImage(img);
// assertFalse(wi.getExtendImageHeader().isExistProfile());
// }
//
// public void testProfileError() throws Exception {
// File profileDir = new File(jpegs, "profile");
// File img = new File(profileDir, "errimg-profileerror.jpg");
//
// ImageWrapper wi = getDecodedImage(img);
// assertFalse(wi.getExtendImageHeader().isExistProfile());
// }
public void testProgressive() throws Exception {
readAndCompare("progressive", "prog_adobe_3.jpg", false);
readAndCompare("progressive", "prog_adobe_4.jpg", false);
readAndCompare("progressive", "prog_adobe_5.jpg", false);
}
public void testIJGQuality() throws Exception {
File profileDir = new File(jpegs, "quality");
File img = new File(profileDir, "quality_80.jpg");
assertTrue(getQuality(img) == 80);
img = new File(profileDir, "quality_90.jpg");
assertTrue(getQuality(img) == 90);
img = new File(profileDir, "quality_95.jpg");
assertTrue(getQuality(img) == 95);
img = new File(profileDir, "quality_unknow.jpg");
assertTrue(getQuality(img) == 99);
}
// YCbCr H2V2 (2x2:1:1, 6 blocks per MCU)
public void testSeqSampleH2V2() throws Exception {
readAndCompare("sample", "seq_2x2_1x1_1x1.jpg", true);
}
//YCbCr H1V1 (1x1:1:1, 3 blocks per MCU)
public void testSeqSampleH1V1() throws Exception {
readAndCompare("sample", "seq_1x1_1x1_1x1.jpg", false);
}
// YCbCr H2V1 (2x1:1:1, 4 blocks per MCU)
public void testSeqSampleH2V1() throws Exception {
readAndCompare("sample", "seq_2x1_1x1_1x1.jpg", true);
}
// YCbCr H1V2 (1x2:1:1, 4 blocks per MCU)
public void testSeqSampleH1V2() throws Exception {
readAndCompare("sample", "seq_1x2_1x1_1x1.jpg", true);
}
public void testProgSampleH1V1() throws Exception {
readAndCompare("sample", "prog_5_111.jpg", false);
}
public void testProgSampleH2V2_1() throws Exception {
readAndCompare("sample", "prog_3_401x350_411.jpg", true);
}
public void testProgSampleH2V2_2() throws Exception {
readAndCompare("sample", "prog_3_64x64_411.jpg", true);
}
public void testProgSampleH2V2() throws Exception {
readAndCompare("sample", "prog_4_299x386_411.jpg", true);
}
public void testProgSampleH2V1() throws Exception {
}
public void testProgSampleH1V2() throws Exception {
}
public void testSeqBaseline111() throws Exception {
readAndCompare("seq", "seq_baseline_111.jpg", false);
}
public void testSeqBaseline411() throws Exception {
readAndCompare("seq", "seq_baseline_411.jpg", true);
}
public void testSeqOpt111() throws Exception {
readAndCompare("seq", "seq_opt_111.jpg", false);
}
public void testSeqOpt411() throws Exception {
readAndCompare("seq", "seq_opt_411.jpg", true);
}
public void testSize() throws Exception {
File sizeDir = new File(jpegs, "size");
for (File f : sizeDir.listFiles()) {
if (!f.getName().endsWith("jpg")) {
continue;
}
boolean ignoreErr = false;
if (f.getName().indexOf("411") > 0) {
ignoreErr = true;
}
try {
readAndCompare("size", f.getName(), ignoreErr);
} catch (Exception e) {
System.out.println(f.getName() + " decode error");
throw e;
}
}
}
protected void readAndCompare(String subDir, String filename, boolean ignoreError)
throws Exception {
File imgDir = new File(jpegs, subDir);
File img = new File(imgDir, filename);
BufferedImage left = getDecodedImage(img).getAsBufferedImage();
BufferedImage right = getStandardImage(img);
compareImage(img.getName(), left, right, ignoreError);
}
protected int getQuality(File f) throws Exception {
FileInputStream in = null;
ImageInputStream imageStream = null;
try {
in = new FileInputStream(f);
imageStream = new ImageBitsInputStream(in);
JPEGDecoder decoder = new JPEGDecoder(imageStream, false, false);
decoder.decode();
return decoder.getQuality();
} finally {
IOUtils.closeQuietly(in);
if (imageStream != null) {
imageStream.close();
}
}
}
protected ImageWrapper getDecodedImage(File f) throws Exception {
FileInputStream in = null;
ImageInputStream imageStream = null;
try {
in = new FileInputStream(f);
imageStream = new ImageBitsInputStream(in);
JPEGDecoder decoder = new JPEGDecoder(imageStream, false, false);
ImageWrapper wi = decoder.decode();
return wi;
} finally {
IOUtils.closeQuietly(in);
if (imageStream != null) {
imageStream.close();
}
}
}
protected BufferedImage getStandardImage(File f) throws Exception {
return ImageIO.read(f);
}
protected void compareImage(String name, BufferedImage left, BufferedImage right,
boolean ignoreError) throws Exception {
if (left.getWidth() != right.getWidth() || left.getHeight() != right.getHeight()) {
assertTrue("size not equal", false);
}
Raster leftRaster = left.getData();
Raster rightRaster = right.getData();
int[] leftPixes = new int[4];
int[] rightPixes = new int[4];
for (int x = 0; x < right.getWidth(); x++) {
for (int y = 0; y < right.getHeight(); y++) {
leftPixes = leftRaster.getPixel(x, y, leftPixes);
rightPixes = rightRaster.getPixel(x, y, rightPixes);
for (int i = 0; i < leftRaster.getNumBands(); i++) {
if (Math.abs(leftPixes[i] - rightPixes[i]) > DIFF_VALUE) {
if (!ignoreError) {
assertTrue(name + "'s pix not equal, sub is "
+ (leftPixes[i] - rightPixes[i]), false);
}
}
leftPixes[i] = 0;
rightPixes[i] = 0;
}
}
}
}
}