Java tutorial
/** * Project: simpleimage-1.1 File Created at 2010-9-6 $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; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.awt.image.renderable.ParameterBlock; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import javax.media.jai.Interpolation; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; import junit.framework.TestCase; import org.apache.commons.io.IOUtils; import com.alibaba.simpleimage.io.ByteArrayOutputStream; import com.alibaba.simpleimage.jai.scale.LanczosScaleOp; import com.alibaba.simpleimage.render.ReadRender; import com.sun.media.jai.opimage.SubsampleAverageOpImage; /** * TODO Comment of ScaleSpeedTest * * @author wendell */ public class ScaleSpeedTest extends TestCase { static File scaleDir = new File("./src/test/resources/conf.test/simpleimage/scale"); public static void main(String[] args) throws Exception { String method = "CSubSample"; String imgName = "large"; int times = 1000; float scale = 0.5f; String imgDir = "/src/test/resources/conf.test/simpleimage/scale"; File rootDir = null; if (args.length > 0) { rootDir = new File(args[0].trim() + imgDir); } if (args.length > 1) { method = args[1]; } if (args.length > 2) { imgName = args[2]; } if (args.length > 3) { scale = Float.parseFloat(args[3]); } if (args.length > 4) { times = Integer.parseInt(args[4]); } ScaleSpeedTest instance = new ScaleSpeedTest(); if ("JSubSample".equalsIgnoreCase(method)) { instance.doScale(rootDir, imgName, instance.new JSubSampleScaler(), times, scale); } else if ("CSubSample".equalsIgnoreCase(method)) { instance.doScale(rootDir, imgName, instance.new CSubSampleScaler(), times, scale); } else if ("Bicurbe".equalsIgnoreCase(method)) { instance.doScale(rootDir, imgName, instance.new BicurbeScaler(), times, scale); } else if ("Bicurbe2".equalsIgnoreCase(method)) { instance.doScale(rootDir, imgName, instance.new Bicube2Scaler(), times, scale); } else if ("lanczos".equalsIgnoreCase(method)) { instance.doScale(rootDir, imgName, instance.new LanczosScaler(), times, scale); } else { throw new IllegalArgumentException("Unknown alg"); } } public void testSpeed() throws Exception { // doScale(scaleDir, "color.jpg", new LanczosScaler(), 1, 0.256f); } public void doScale(File rootDir, String imgName, Scaler scaler, int times, float scale) throws Exception { FileInputStream inputStream = new FileInputStream(new File(rootDir, imgName)); ByteArrayOutputStream temp = new ByteArrayOutputStream(); IOUtils.copy(inputStream, temp); IOUtils.closeQuietly(inputStream); InputStream img = temp.toInputStream(); temp = null; System.out.println("***********Scale Performance Test**************"); long start = 0L, end = 0L, total = 0L; img.reset(); ReadRender rr = new ReadRender(img, false); ImageWrapper wi = rr.render(); BufferedImage bi = wi.getAsBufferedImage(); for (int i = 0; i < times; i++) { start = System.currentTimeMillis(); PlanarImage zoomOp = scaler.doScale(PlanarImage.wrapRenderedImage(bi), scale); zoomOp.getAsBufferedImage(); end = System.currentTimeMillis(); total += (end - start); } System.out.printf("Scale alg : %s \n", scaler.getName()); System.out.println("Image : " + imgName); System.out.printf("Times : %d\n", times); System.out.printf("Total time : %d ms\n", total); System.out.printf("Average time : %.2f ms\n", ((double) total / times)); } interface Scaler { public PlanarImage doScale(PlanarImage in, float scale); public String getName(); } class BicurbeScaler implements Scaler { /* * (non-Javadoc) * @see com.alibaba.simpleimage.ScaleSpeedTest.Scaler#doScale(float) */ public PlanarImage doScale(PlanarImage in, float scale) { ParameterBlock pb = new ParameterBlock(); pb.addSource(in); pb.add(scale); pb.add(scale); pb.add(0.0F); pb.add(0.0F); pb.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC)); RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); return JAI.create("scale", pb, qualityHints); } public String getName() { return "Bicurbe"; } } class Bicube2Scaler implements Scaler { /* * (non-Javadoc) * @see com.alibaba.simpleimage.ScaleSpeedTest.Scaler#doScale(float) */ public PlanarImage doScale(PlanarImage in, float scale) { ParameterBlock pb = new ParameterBlock(); pb.addSource(in); pb.add(scale); pb.add(scale); pb.add(0.0F); pb.add(0.0F); pb.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC_2)); RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); return JAI.create("scale", pb, qualityHints); } public String getName() { return "Bicurbe2"; } } class CSubSampleScaler implements Scaler { /* * (non-Javadoc) * @see com.alibaba.simpleimage.ScaleSpeedTest.Scaler#doScale(javax.media .jai.PlanarImage, float) */ public PlanarImage doScale(PlanarImage in, float scale) { ParameterBlock pb = new ParameterBlock(); pb.addSource(in); pb.add((double) scale); pb.add((double) scale); RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); return JAI.create("SubsampleAverage", pb, qualityHints); } public String getName() { return "CSubSample"; } } class JSubSampleScaler implements Scaler { /* * (non-Javadoc) * @see com.alibaba.simpleimage.ScaleSpeedTest.Scaler#doScale(javax.media .jai.PlanarImage, float) */ public PlanarImage doScale(PlanarImage in, float scale) { PlanarImage zoomOp = new SubsampleAverageOpImage(in, null, null, (double) scale, (double) scale); return zoomOp; } public String getName() { return "JSubSample"; } } class LanczosScaler implements Scaler { public PlanarImage doScale(PlanarImage in, float scale) { LanczosScaleOp lanczosOp = new LanczosScaleOp(scale, scale); BufferedImage dest = lanczosOp.compute(in.getAsBufferedImage()); return PlanarImage.wrapRenderedImage(dest); } public String getName() { return "Lanczos"; } } }