com.alibaba.simpleimage.codec.jpeg.JPEGDecoderFunctionTest.java Source code

Java tutorial

Introduction

Here is the source code for com.alibaba.simpleimage.codec.jpeg.JPEGDecoderFunctionTest.java

Source

/**
 * 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;
                }
            }
        }
    }
}