`

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代码的实现

    5. **随机数生成**:抽奖结果的随机性需要通过Java的Random类来实现,生成一个随机角度让指针停在奖品区域。 6. **对话框(Dialog)显示**:当指针停止后,需要弹出一个对话框告诉用户获得了几等奖。Java的...

    Picture_Change.rar_picture_change_图片旋转

    这些算法用于在新坐标系中生成新的像素值,以确保旋转后的图像质量不受影响。 2. **近似旋转**: 对于性能要求较高的应用,可能会采用近似旋转,牺牲部分图像质量以换取更快的计算速度。这种方法可能会导致边缘模糊...

    安卓UI布局相关-动态生成任意张图片控件.zip

    本资源“安卓UI布局相关-动态生成任意张图片控件.zip”着重于动态创建图片控件,这对于需要根据运行时数据或用户操作来灵活调整界面的应用尤其重要。 动态生成图片控件的概念是基于安卓的View类和布局管理器,例如...

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

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现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配置是否成功 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...

    安卓抽奖动画 随机变换

    属性动画是安卓3.0(API Level 11)引入的新特性,它可以改变对象的任意属性并随着时间推移更新视图,而视图动画只改变显示效果,不改变对象的实际状态。在抽奖动画中,我们通常会用到属性动画,因为它可以实现更...

    支持对照片进行旋转等功能

    uCrop库提供了一个直观且易用的接口,允许用户以任意角度(通常支持90度、180度和270度)旋转图片。这涉及到Android的Matrix类和Bitmap类的使用,通过矩阵变换来实现图像的旋转。 其次,图片翻转是另一个实用特性,...

    android bitmap

    - 调用`Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix matrix, boolean filter)`,使用合并后的Matrix创建旋转后的Bitmap。 5. **Matrix详解**: - Matrix提供了各种矩阵操作...

    button动画

    具体到Button动画,如果涉及到复杂的计算或者网络请求,比如加载动画图片资源,应当在子线程中进行,加载完成后通过post或者runOnUiThread方法回到主线程设置动画。以下是一个简单的例子: ```java new Thread(new ...

    libyuv 代码

    Libyuv支持90度、180度、270度的整数倍旋转,同时也支持任意角度的旋转,这对于处理设备方向变化或用户自定义旋转角度的情况非常有用。 4. **格式转换**: Libyuv支持多种图像格式的转换,包括但不限于YUV、NV12、...

    ImageMagick-6.2.6-8-Q16-windows-dll.exe

    在开发过程中,ImageMagick的API可以用来实现诸如图片上传后的自动化处理、批量转换、生成缩略图等功能。对于Web开发者来说,它能有效地提高网站的图像处理效率,尤其是对于那些需要大量处理用户上传图片的应用来说...

Global site tag (gtag.js) - Google Analytics