From 8c2af2c3c53d7d3579157d35a70094023a0e0305 Mon Sep 17 00:00:00 2001 From: Schmidor Date: Wed, 16 Dec 2015 23:18:09 +0100 Subject: [PATCH] Finish TIFFUtilities.applyOrientation --- .../contrib/tiff/TIFFUtilities.java | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java index d7e63381..c4fc3815 100644 --- a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java +++ b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java @@ -243,57 +243,73 @@ public class TIFFUtilities { } public static BufferedImage applyOrientation(BufferedImage input, int orientation) { - //TODO: Translations are currently off for non quadratic images - boolean flipExtends = false; - AffineTransform transform = AffineTransform.getTranslateInstance(input.getWidth() / 2, input.getHeight() / 2); + int w = input.getWidth(); + int h = input.getHeight(); + double cW = w / 2.0; + double cH = h / 2.0; + + AffineTransform orientationTransform = new AffineTransform(); switch (orientation) { case TIFFBaseline.ORIENTATION_TOPLEFT: // normal return input; case TIFFExtension.ORIENTATION_TOPRIGHT: // flipped vertically - transform.scale(-1, 1); + orientationTransform.translate(cW, cH); + orientationTransform.scale(-1, 1); + orientationTransform.translate(-cW, -cH); break; case TIFFExtension.ORIENTATION_BOTRIGHT: // rotated 180� - transform.quadrantRotate(2); + orientationTransform.quadrantRotate(2, cW, cH); break; case TIFFExtension.ORIENTATION_BOTLEFT: // flipped horizontally - transform.scale(1, -1); + orientationTransform.translate(cW, cH); + orientationTransform.scale(1, -1); + orientationTransform.translate(-cW, -cH); break; case TIFFExtension.ORIENTATION_LEFTTOP: - transform.scale(1, -1); - transform.quadrantRotate(1); + orientationTransform.translate(cW, cH); + orientationTransform.scale(-1, 1); + orientationTransform.quadrantRotate(1); + orientationTransform.translate(-cW, -cH); flipExtends = true; break; case TIFFExtension.ORIENTATION_RIGHTTOP: // rotated 90� - transform.quadrantRotate(1); + orientationTransform.quadrantRotate(1, cW, cH); flipExtends = true; break; case TIFFExtension.ORIENTATION_RIGHTBOT: - transform.scale(-1, 1); - transform.quadrantRotate(1); + orientationTransform.translate(cW, cH); + orientationTransform.scale(1, -1); + orientationTransform.quadrantRotate(1); + orientationTransform.translate(-cW, -cH); flipExtends = true; break; case TIFFExtension.ORIENTATION_LEFTBOT: // rotated 270� - transform.quadrantRotate(3); + orientationTransform.quadrantRotate(3, cW, cH); flipExtends = true; break; } - int w = input.getWidth(); - int h = input.getHeight(); + int newW, newH; if (flipExtends) { - w = input.getHeight(); - h = input.getWidth(); + newW = h; + newH = w; + } + else { + newW = w; + newH = h; } - BufferedImage output = new BufferedImage(w, h, input.getType()); - transform.translate(-h / 2, -w / 2); + AffineTransform transform = AffineTransform.getTranslateInstance((newW - w) / 2.0, (newH - h) / 2.0); + transform.concatenate(orientationTransform); + + BufferedImage output = new BufferedImage(newW, newH, input.getType()); ((Graphics2D) output.getGraphics()).drawImage(input, transform, null); return output;