package com.blogspot.na5cent.utils; import java.awt.RenderingHints; import java.awt.RenderingHints.Key; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; /** * * @author redcrow */ public class ImageUtils { public static void rotate(File file, int degree) throws IOException { if (degree < 0) { degree = 360 + degree; } BufferedImage input = ImageIO.read(file); BufferedImage rotated = rotate(input, degree); ImageIO.write(rotated, getMimeType(file.getAbsolutePath()), file); } public static void rotate180(File file) throws IOException { BufferedImage input = ImageIO.read(file); BufferedImage rotated = rotate(input, 180); ImageIO.write(rotated, getMimeType(file.getAbsolutePath()), file); } public static void rotate90(File file) throws IOException { BufferedImage input = ImageIO.read(file); BufferedImage rotated = rotate(input, 90); ImageIO.write(rotated, getMimeType(file.getAbsolutePath()), file); } private static String getMimeType(String fileName) { if (fileName.toLowerCase().endsWith("png")) { return "png"; } else if (fileName.toLowerCase().endsWith("jpg") || fileName.toLowerCase().endsWith("jpeg")) { return "jpeg"; } else if (fileName.toLowerCase().endsWith("gif")) { return "gif"; } else { return "bmp"; } } /** * I borrow code from * http://stackoverflow.com/questions/2687926/how-can-i-rotate-an-image-using-java-swing-and-then-set-its-origin-to-0-0 * But I found one problem with JPEG encode image. JPEG image has no * color,but PNG GIF not found this problem. I discover that if i not * specify rendereing hint JPEG encoder perform wrong color on result image. * I add this line to fix problem AffineTransformOp op = new * AffineTransformOp(xform,new * RenderingHints(RenderingHints.KEY_COLOR_RENDERING, * RenderingHints.VALUE_COLOR_RENDER_SPEED)); */ public static BufferedImage rotate(BufferedImage image, int _theta) { /* * Affline transform only works with perfect squares. The following * code is used to take any rectangle image and rotate it correctly. * To do this it chooses a center point that is half the greater * length and tricks the library to think the image is a perfect * square, then it does the rotation and tells the library where * to find the correct top left point. The special cases in each * orientation happen when the extra image that doesn't exist is * either on the left or on top of the image being rotated. In * both cases the point is adjusted by the difference in the * longer side and the shorter side to get the point at the * correct top left corner of the image. NOTE: the x and y * axes also rotate with the image so where width > height * the adjustments always happen on the y axis and where * the height > width the adjustments happen on the x axis. * */ AffineTransform xform = new AffineTransform(); if (image.getWidth() > image.getHeight()) { xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getWidth()); xform.rotate(Math.toRadians(_theta)); int diff = image.getWidth() - image.getHeight(); switch (_theta) { case 90: xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff); break; case 180: xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth() + diff); break; default: xform.translate(-0.5 * image.getWidth(), -0.5 * image.getWidth()); break; } } else if (image.getHeight() > image.getWidth()) { xform.setToTranslation(0.5 * image.getHeight(), 0.5 * image.getHeight()); xform.rotate(Math.toRadians(_theta)); int diff = image.getHeight() - image.getWidth(); switch (_theta) { case 180: xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight()); break; case 270: xform.translate(-0.5 * image.getHeight() + diff, -0.5 * image.getHeight()); break; default: xform.translate(-0.5 * image.getHeight(), -0.5 * image.getHeight()); break; } } else { xform.setToTranslation(0.5 * image.getWidth(), 0.5 * image.getHeight()); xform.rotate(Math.toRadians(_theta)); xform.translate(-0.5 * image.getHeight(), -0.5 * image.getWidth()); } Map<Key, Object> renderingHint = new HashMap<Key, Object>(); renderingHint.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); renderingHint.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); AffineTransformOp op = new AffineTransformOp(xform, new RenderingHints(renderingHint)); return op.filter(image, op.createCompatibleDestImage(image, null)); } }
วันอังคารที่ 16 ตุลาคม พ.ศ. 2555
การเขียน java หมุนรูปภาพ (java rotate image file)
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น