JAVA 按任意角度旋转图片,并生成新的旋转后图片

         JAVA 按任意角度旋转图片,并生成新的旋转后图片


import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;

public class ImageUtil {

	public static BufferedImage rotateImage(final BufferedImage bufferedimage,
	          final int angle){
		  
		  int width = bufferedimage.getWidth();  
	      int height = bufferedimage.getHeight();  
	    
	      BufferedImage dstImage = null;  
	      AffineTransform affineTransform = new AffineTransform();  
	    
	      if (angle == 180) {  
	          affineTransform.translate(width, height);  
	          dstImage = new BufferedImage(width, height, bufferedimage.getType());  
	      } else if (angle == 90) {  
	          affineTransform.translate(height, 0);  
	          dstImage = new BufferedImage(height, width, bufferedimage.getType());  
	      } else if (angle == 270) {  
	          affineTransform.translate(0, width);  
	          dstImage = new BufferedImage(height, width, bufferedimage.getType());  
	      }  
	      
	      affineTransform.rotate(java.lang.Math.toRadians(angle));  
	      AffineTransformOp affineTransformOp = new AffineTransformOp(  
	              affineTransform,  
	              AffineTransformOp.TYPE_NEAREST_NEIGHBOR);  
	    
	      return affineTransformOp.filter(bufferedimage, dstImage);  

	  }
}




另附上生成新的图片


import java.awt.Graphics2D;   
import java.awt.Image;   
import java.awt.MediaTracker;   
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.Iterator;   
  
import javax.imageio.IIOImage;   
import javax.imageio.ImageIO;   
import javax.imageio.ImageTypeSpecifier;   
import javax.imageio.ImageWriteParam;   
import javax.imageio.ImageWriter;   
import javax.imageio.stream.ImageOutputStream;   
import javax.swing.JPanel;   
  
public class RotateImage extends JPanel {   
  
    Image image;   
  
    BufferedImage bufImage; // 用于显示的缓冲区图像   
  
    BufferedImage originalBufImage; // 原始缓冲区图像   
  
    Graphics2D bufImageG; // 缓冲区图像的图形环境   
  
    public void loadImage(String fileName) {   
  
        image = this.getToolkit().getImage(fileName); // 取得图像   
        MediaTracker mt = new MediaTracker(this); // 实例化媒体加载器   
        mt.addImage(image, 0); // 增加图像到加载器中   
        try {   
            mt.waitForAll(); // 等待图片加载   
        } catch (Exception ex) {   
            ex.printStackTrace(); // 输出出错信息   
        }   
        originalBufImage = new BufferedImage(image.getWidth(this), image   
                .getHeight(this), BufferedImage.TYPE_INT_ARGB); // 创建原始缓冲区图像   
        bufImage = originalBufImage;   
        bufImageG = bufImage.createGraphics(); // 创建bufImage的图形环境   
        bufImageG.drawImage(image, 0, 0, this); // 传输源图像数据到缓冲区图像中   
    }   
  
    // 过滤图像   
    public void ratoteImage(int angle) {   
  
        if (bufImage == null)   
            return; // 如果bufImage为空则直接返回   
        BufferedImage filteredBufImage = new BufferedImage(   
                image.getWidth(this), image.getHeight(this),   
                BufferedImage.TYPE_INT_RGB); // 过滤后的图像   
  
        AffineTransform transform = new AffineTransform(); // 仿射变换对象   
        transform.rotate(java.lang.Math.toRadians(angle),   
                image.getWidth(this) / 2, image.getHeight(this) / 2); // 旋转图像   
  
        AffineTransformOp imageOp = new AffineTransformOp(transform, null);// 创建仿射变换操作对象   
        imageOp.filter(originalBufImage, filteredBufImage);// 过滤图像,目标图像在filteredBufImage   
        bufImage = filteredBufImage; // 让用于显示的缓冲区图像指向过滤后的图像   
  
        drawImg(bufImage);   
    }   
  
    public void drawImg(BufferedImage image) {   
        ImageWriter writer = null;   
        ImageTypeSpecifier type = ImageTypeSpecifier   
                .createFromRenderedImage(image);   
        Iterator iter = ImageIO.getImageWriters(type, "jpg");   
        if (iter.hasNext()) {   
            writer = (ImageWriter) iter.next();   
        }   
        if (writer == null) {   
            return;   
        }   
        IIOImage iioImage = new IIOImage(image, null, null);   
        ImageWriteParam param = writer.getDefaultWriteParam();   
  
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);   
  
        param.setCompressionQuality((float) ((1) / 10.0));   
        ImageOutputStream outputStream;   
        try {   
            outputStream = ImageIO   
                    .createImageOutputStream(new File("test.jpg"));   
            writer.setOutput(outputStream);   
            writer.write(null, iioImage, param);   
        } catch (IOException e) {   
            e.printStackTrace();   
        }   
    }   
  
    /**  
     * @param args  
     */  
    public static void main(String[] args) {   
        RotateImage rotateImg = new RotateImage();   
        rotateImg.loadImage("bm.jpg"); // 装载图片   
        rotateImg.ratoteImage(90);   
  
    }   
  
}  


你可能感兴趣的:(java)