/* * Copyright 2013, Morten Nobel-Joergensen * * License: The BSD 3-Clause License * http://opensource.org/licenses/BSD-3-Clause */ package com.mortennobel.imagescaling; import junit.framework.TestCase; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import javax.swing.*; import java.awt.image.BufferedImage; import java.net.URL; import java.util.Iterator; import java.io.IOException; import com.mortennobel.imagescaling.ResampleOp; import com.mortennobel.imagescaling.AdvancedResizeOp; /** * Test case on bugreport and code by Murugesh Ramachandran */ public class Issue5 extends TestCase { public void testSRGB() throws Exception{ try { // Read the original image from the Server Location String[] fileTypes = {"jpg","png","JPG","GIF"}; boolean bFlag = false; //File inputFile = new File(imageLoc); bFlag = false; int fixlength = 1600; int calcHeight = 0; int calcWidth = 0; // BufferedImage bufferedImage = ImageIO.read(getClass().getResourceAsStream("pic_010b(17MB).jpg")); BufferedImage bufferedImage = readImage(getClass().getResourceAsStream("pic_010b(17MB).jpg")); // Calculate the new Height if not specified if(bufferedImage.getHeight() > bufferedImage.getWidth()){ if(bufferedImage.getHeight() > 1600){ calcWidth = fixlength * bufferedImage.getWidth() / bufferedImage.getHeight(); calcHeight = 1600; bFlag = true; } else{ calcWidth = bufferedImage.getWidth(); calcHeight = bufferedImage.getHeight(); } } else{ if( bufferedImage.getWidth() > 1600){ calcHeight = fixlength * bufferedImage.getHeight() / bufferedImage.getWidth(); calcWidth = 1600; bFlag = true; } else{ calcWidth = bufferedImage.getWidth(); calcHeight = bufferedImage.getHeight(); } } System.out.println(calcHeight); BufferedImage rescaledImage = createResizedCopy(bufferedImage, calcWidth, calcHeight); // ImageIO.write(rescaledImage, "jpg", new File("/Users/morten/Programmering/java/ImageScaling/test/com/mortennobel/imagescaling/issues/rescaled.jpg")); int res = JOptionPane.showConfirmDialog(null, "Do you see a scaled image?", "", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon(rescaledImage)); assertEquals(JOptionPane.YES_OPTION ,res); } catch (Exception e) { e.printStackTrace(); } } /** * Workaround for sRGB color space bug on JRE 1.5 * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4705399 * * @param source (inputstream or File) * @return fixed buffered image * @throws IOException */ public static BufferedImage readImage(Object source) throws IOException { ImageInputStream stream = ImageIO.createImageInputStream(source); ImageReader reader = ImageIO.getImageReaders(stream).next(); reader.setInput(stream); ImageReadParam param =reader.getDefaultReadParam(); ImageTypeSpecifier typeToUse = null; for (Iterator i = reader.getImageTypes(0);i.hasNext(); ) { ImageTypeSpecifier type = (ImageTypeSpecifier) i.next(); if (type.getColorModel().getColorSpace().isCS_sRGB()) typeToUse = type; } if (typeToUse!=null) param.setDestinationType(typeToUse); BufferedImage b = reader.read(0, param); reader.dispose(); stream.close(); return b; } public static BufferedImage createResizedCopy(BufferedImage originalImage, int scaledWidth, int scaledHeight) { ResampleOp resampleOp = new ResampleOp (scaledWidth,scaledHeight); resampleOp.setUnsharpenMask(AdvancedResizeOp.UnsharpenMask.VerySharp); BufferedImage rescaledTomato = resampleOp.filter(originalImage, null); return rescaledTomato; } }