package com.twelvemonkeys.image;
import org.junit.Ignore;
import org.junit.Test;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImagingOpException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.*;
/**
* ResampleOpTestCase
*
* @author <a href="mailto:harald.kuhr@gmail.com">Harald Kuhr</a>
* @author last modified by $Author: haku $
* @version $Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-core/src/test/java/com/twelvemonkeys/image/ResampleOpTestCase.java#1 $
*/
public class ResampleOpTestCase {
protected BufferedImage createImage(final int pWidth, final int pHeigth) {
return createImage(pWidth, pHeigth, BufferedImage.TYPE_INT_ARGB);
}
protected BufferedImage createImage(final int pWidth, final int pHeigth, final int pType) {
BufferedImage image = new BufferedImage(pWidth, pHeigth, pType);
Graphics2D g = image.createGraphics();
try {
g.setPaint(new GradientPaint(0, 0, Color.RED, pWidth, pHeigth, new Color(0x00000000, true)));
g.fillRect(0, 0, pWidth, pHeigth);
}
finally {
g.dispose();
}
return image;
}
@Test
public void testCreateImage() {
// Sanity test the create method
BufferedImage image = createImage(79, 84);
assertNotNull(image);
assertEquals(79, image.getWidth());
assertEquals(84, image.getHeight());
}
private void assertResample(final BufferedImage pImage, final int pWidth, final int pHeight, final int pFilterType) {
BufferedImage result = new ResampleOp(pWidth, pHeight, pFilterType).filter(pImage, null);
assertNotNull(result);
assertEquals(pWidth, result.getWidth());
assertEquals(pHeight, result.getHeight());
result = new ResampleOp(pImage.getWidth(), pImage.getHeight(), pFilterType).filter(createImage(pWidth, pHeight), pImage);
assertNotNull(result);
assertEquals(pImage.getType(), result.getType());
assertSame(pImage, result);
assertEquals(pImage.getWidth(), result.getWidth());
assertEquals(pImage.getHeight(), result.getHeight());
result = new ResampleOp(pImage.getWidth(), pImage.getHeight(), pFilterType).filter(createImage(pWidth, pHeight), createImage(pWidth, pHeight, pImage.getType()));
assertNotNull(result);
assertEquals(pImage.getType(), result.getType());
assertEquals(pWidth, result.getWidth());
assertEquals(pHeight, result.getHeight());
}
private void assertResampleBufferedImageTypes(final int pFilterType) {
List<String> exceptions = new ArrayList<>();
// Test all image types in BufferedImage
for (int type = BufferedImage.TYPE_INT_ARGB; type <= BufferedImage.TYPE_BYTE_INDEXED; type++) {
// TODO: Does not currently work with TYPE_BYTE_GRAY or TYPE_USHORT_GRAY
// TODO: FixMe!
if ((pFilterType == ResampleOp.FILTER_POINT || pFilterType == ResampleOp.FILTER_TRIANGLE) &&
(type == BufferedImage.TYPE_BYTE_GRAY || type == BufferedImage.TYPE_USHORT_GRAY)) {
continue;
}
BufferedImage image = createImage(10, 10, type);
try {
assertResample(image, 15, 5, pFilterType);
}
catch (ImagingOpException e) {
// NOTE: It is currently allowed for filters to throw this exception and it is PLATFORM DEPENDENT..
System.err.println("WARNING: " + e.getMessage() + ", image: " + image);
//e.printStackTrace();
}
catch (Throwable t) {
exceptions.add(t.toString() + ": " + image.toString());
}
}
assertEquals("Filter threw exceptions: ", Collections.EMPTY_LIST, exceptions);
}
// 1x1
@Test
public void testResample1x1Point() {
assertResample(createImage(1, 1), 10, 11, ResampleOp.FILTER_POINT);
}
@Test
public void testResample1x1Box() {
assertResample(createImage(1, 1), 10, 11, ResampleOp.FILTER_BOX);
}
@Test
public void testResample1x1Triangle() {
assertResample(createImage(1, 1), 19, 13, ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResample1x1Lanczos() {
assertResample(createImage(1, 1), 7, 49, ResampleOp.FILTER_LANCZOS);
}
@Test
public void testResample1x1Gaussian() {
assertResample(createImage(1, 1), 11, 34, ResampleOp.FILTER_GAUSSIAN);
}
@Test
public void testResample1x1Sinc() {
assertResample(createImage(1, 1), 2, 8, ResampleOp.FILTER_BLACKMAN_SINC);
}
// 2x2
@Test
public void testResample2x2Point() {
assertResample(createImage(2, 2), 10, 11, ResampleOp.FILTER_POINT);
}
@Test
public void testResample2x2Box() {
assertResample(createImage(2, 2), 10, 11, ResampleOp.FILTER_BOX);
}
@Test
public void testResample2x2Triangle() {
assertResample(createImage(2, 2), 19, 13, ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResample2x2Lanczos() {
assertResample(createImage(2, 2), 7, 49, ResampleOp.FILTER_LANCZOS);
}
@Test
public void testResample2x2Gaussian() {
assertResample(createImage(2, 2), 11, 34, ResampleOp.FILTER_GAUSSIAN);
}
@Test
public void testResample2x2Sinc() {
assertResample(createImage(2, 2), 2, 8, ResampleOp.FILTER_BLACKMAN_SINC);
}
// 3x3
@Test
public void testResample3x3Point() {
assertResample(createImage(3, 3), 10, 11, ResampleOp.FILTER_POINT);
}
@Test
public void testResample3x3Box() {
assertResample(createImage(3, 3), 10, 11, ResampleOp.FILTER_BOX);
}
@Test
public void testResample3x3Triangle() {
assertResample(createImage(3, 3), 19, 13, ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResample3x3Lanczos() {
assertResample(createImage(3, 3), 7, 49, ResampleOp.FILTER_LANCZOS);
}
@Test
public void testResample3x3Gaussian() {
assertResample(createImage(3, 3), 11, 34, ResampleOp.FILTER_GAUSSIAN);
}
@Test
public void testResample3x3Sinc() {
assertResample(createImage(3, 3), 2, 8, ResampleOp.FILTER_BLACKMAN_SINC);
}
// 4x4
@Test
public void testResample4x4Point() {
assertResample(createImage(4, 4), 10, 11, ResampleOp.FILTER_POINT);
}
@Test
public void testResample4x4Box() {
assertResample(createImage(4, 4), 10, 11, ResampleOp.FILTER_BOX);
}
@Test
public void testResample4x4Triangle() {
assertResample(createImage(4, 4), 19, 13, ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResample4x4Lanczos() {
assertResample(createImage(4, 4), 7, 49, ResampleOp.FILTER_LANCZOS);
}
@Test
public void testResample4x4Gaussian() {
assertResample(createImage(4, 4), 11, 34, ResampleOp.FILTER_GAUSSIAN);
}
@Test
public void testResample4x4Sinc() {
assertResample(createImage(4, 4), 2, 8, ResampleOp.FILTER_BLACKMAN_SINC);
}
// 20x20
@Test
public void testResample20x20Point() {
assertResample(createImage(20, 20), 10, 11, ResampleOp.FILTER_POINT);
}
@Test
public void testResample20x20Box() {
assertResample(createImage(20, 20), 10, 11, ResampleOp.FILTER_BOX);
}
@Test
public void testResample20x20Triangle() {
assertResample(createImage(20, 20), 19, 13, ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResample20x20Lanczos() {
assertResample(createImage(20, 20), 7, 49, ResampleOp.FILTER_LANCZOS);
}
@Test
public void testResample20x20Gaussian() {
assertResample(createImage(20, 20), 11, 34, ResampleOp.FILTER_GAUSSIAN);
}
@Test
public void testResample20x20Sinc() {
assertResample(createImage(20, 20), 2, 8, ResampleOp.FILTER_BLACKMAN_SINC);
}
// 200x160
@Test
public void testResample200x160Point() {
assertResample(createImage(200, 160), 10, 11, ResampleOp.FILTER_POINT);
}
@Test
public void testResample200x160Box() {
assertResample(createImage(200, 160), 10, 11, ResampleOp.FILTER_BOX);
}
@Test
public void testResample200x160Triangle() {
assertResample(createImage(200, 160), 19, 13, ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResample200x160Lanczos() {
assertResample(createImage(200, 160), 7, 49, ResampleOp.FILTER_LANCZOS);
}
@Test
public void testResample200x160Gaussian() {
assertResample(createImage(200, 160), 11, 34, ResampleOp.FILTER_GAUSSIAN);
}
@Test
public void testResample200x160Sinc() {
assertResample(createImage(200, 160), 2, 8, ResampleOp.FILTER_BLACKMAN_SINC);
}
// Test 10x10 -> 15x5 with different algorithms and types
@Test
public void testResamplePoint() {
assertResampleBufferedImageTypes(ResampleOp.FILTER_POINT);
}
@Test
public void testResampleBox() {
assertResampleBufferedImageTypes(ResampleOp.FILTER_BOX);
}
@Test
public void testResampleTriangle() {
assertResampleBufferedImageTypes(ResampleOp.FILTER_TRIANGLE);
}
@Test
public void testResampleLanczos() {
assertResampleBufferedImageTypes(ResampleOp.FILTER_LANCZOS);
}
// https://github.com/haraldk/TwelveMonkeys/issues/195
@Test
public void testAIOOBEHeight() {
BufferedImage myImage = new BufferedImage(100, 354, BufferedImage.TYPE_INT_ARGB);
for (int i = 19; i > 0; i--) {
ResampleOp resampler = new ResampleOp(100, i, ResampleOp.FILTER_LANCZOS);
BufferedImage resizedImage = resampler.filter(myImage, null);
assertNotNull(resizedImage);
}
}
// https://github.com/haraldk/TwelveMonkeys/issues/195
@Test
public void testAIOOBEWidth() {
BufferedImage myImage = new BufferedImage(2832, 283, BufferedImage.TYPE_INT_ARGB);
for (int i = 145; i > 143; i--) {
ResampleOp resampler = new ResampleOp(i, 14, ResampleOp.FILTER_LANCZOS);
BufferedImage resizedImage = resampler.filter(myImage, null);
assertNotNull(resizedImage);
}
}
@Ignore("Not for general unit testing")
@Test
public void testTime() {
int iterations = 1000;
for (int i = 0; i < iterations; i++) {
assertResample(createImage(50, 50), 33, 33, ResampleOp.FILTER_LANCZOS);
}
long start = System.currentTimeMillis();
for (int i = 0; i < iterations; i++) {
assertResample(createImage(512, 512), 145, 145, ResampleOp.FILTER_LANCZOS);
}
long end = System.currentTimeMillis();
System.out.printf("time: %d ms, avg %s ms%n", end - start, (end - start) / (double) iterations);
}
}