实验任务四
图像处理中的算法问题(图像旋转)
1、 系统设计要求
将下列图像旋转90度
2、 设计思路与方案
1) 设计思路
- 首先将bmp图片文件读取并存储。
- 同时创建一个图片文件操作流,为旋转后的文件进行保存并输出。
- 调用Java中自带的画笔Graphics2D进行文件的旋转操作。
- 将旋转后的图片数据传入文件操作流,同时输出文件名为90.bmp的图片文件。
2) 程序总体框图
3.完整代码(Java)
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
public class RotateImage{
public static void main(String[] args) {
try {
File raw = new File("1.bmp");
BufferedImage bufferedImage = ImageIO.read(raw); //文件读取
BufferedImage bufferedImage2 = rotateImage(bufferedImage, 90);//图片旋转90°,宽高不变
File outputfile2 = new File("2.bmp");//输出文件名为2.bmp的图片文件
ImageIO.write(bufferedImage2,"bmp",outputfile2);
BufferedImage bufferedImage3 = rotateImage2(bufferedImage, 90);
File outputfile3 = new File("90.bmp");
ImageIO.write(bufferedImage3,"bmp",outputfile3);
} catch (IOException e) {
e.printStackTrace();
}
}
/* 旋转图片为指定角度 图片宽高不变*/
public static BufferedImage rotateImage(final BufferedImage bufferedimage, final int degree)
{
int w= bufferedimage.getWidth(); // 得到图片宽度。
int h= bufferedimage.getHeight();// 得到图片高度。
int type= bufferedimage.getColorModel().getTransparency();// 得到图片透明度。
BufferedImage img;// 空的图片。
Graphics2D graphics2d;// 空的画笔。
graphics2d= (img= new BufferedImage(w, h, type)).createGraphics();
graphics2d.setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.rotate(Math.toRadians(degree), w/2, h/2);// 旋转,degree是整型,度数,比如垂直90度。 •rotate(double arc,double x, double y):图形以点(x,y)为轴点,旋转arc弧度。
graphics2d.drawImage(bufferedimage, 0, 0, null);// 从bufferedimagecopy图片至img,0,0是img的坐标。
graphics2d.dispose();
return img;// 返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。
}
/* 旋转图片为指定角度 同时旋转宽高 */
public static BufferedImage rotateImage2(final BufferedImage bufferedimage, final int degree)
{
int w= bufferedimage.getWidth(); // 得到图片宽度。
int h= bufferedimage.getHeight();// 得到图片高度。
BufferedImage img;// 空的图片。
int x = (h / 2) - (bufferedimage.getWidth() / 2);// 确定原点坐标
int y = (w / 2) - (bufferedimage.getHeight() / 2);
AffineTransform at = new AffineTransform();
at.rotate(Math.toRadians(degree), h / 2, w / 2);// 旋转图象
at.translate(x, y);
AffineTransformOp op = new AffineTransformOp(at,
AffineTransformOp.TYPE_BICUBIC);
img = new BufferedImage(h, w,bufferedimage.getType());
img = op.filter(bufferedimage, img);
return img;// 返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。
}
}
4.运行结果示例