java如何利用rotate旋转图片_JAVA 按任意角度旋转图片,并生成新的旋转后图片(转自:http://www.hackchina.com/r/21265/RotateImage.java__h...

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值