`

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

    博客分类:
  • 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上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java范例开发大全

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7...

    Java范例开发大全(全书源程序)

    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...

    java范例开发大全(pdf&源码)

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    轻松水印7.0.3 完美破解版.rar

    支持水印透明度和旋转角度的任意调整,加注效果更理想; 支持精确定位、平铺和填充等三种模式的水印加注方式。 用户不仅可以自定义文字或图片作为水印,字型的大小、颜色、位置等等参数都可以由用户自由的设定; ...

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    网管教程 从入门到精通软件篇.txt

    向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。  format  将指定的驱动器格式化为指定的文件系统。含有下列参数的 format 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同...

Global site tag (gtag.js) - Google Analytics