700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java 使图片旋转以及水平翻转垂直翻转(详细且可用)

Java 使图片旋转以及水平翻转垂直翻转(详细且可用)

时间:2019-01-06 01:28:35

相关推荐

Java 使图片旋转以及水平翻转垂直翻转(详细且可用)

最近在做小型游戏,遇到了要翻转图片的苦恼,经过我一下午的研究,终于发现了一种好用的方法。

部分代码来源于别人,我在这个基础上修改了下,变得更好用了,之前的别人Image输入都是BufferedImage,我改成了Image,

也就是加了一个转换

大家如果看不懂代码没关系,会用就行了,我会展示一下怎么用的

ImageRotate类

package mypackage;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;/*** Author Mythos_Q** Time -07-20** Description 图片旋转、翻转处理*/public class ImgRotate {static int Up_Down_Reverse = 0;static int Left_Right_Reverse = 1;/*** 旋转图片为指定角度* * @param bufferedimage* 目标图像* @param degree* 旋转角度* @return*/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(h, w, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2 + (w>h?(w-h)/2:(h-w)/2));graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();return img;}/*** 旋转图片为指定角度** @param file* 目标图像* @param degree* 旋转角度(90,180,270)* @return*/public static File rotateImage(File file,int degree) throws Exception{if(degree==90) return rotateImage90(file);if(degree==180) return rotateImage180(file);if(degree==270) return rotateImage270(file);return null;}public static Image rotateImage(Image Image,int degree) {if(degree==90) return rotateImage90(Image);if(degree==180)return rotateImage180(Image);if(degree==270)return rotateImage270(Image);return null;}private static Image rotateImage90(Image image) {BufferedImage bufferedimage = ImageToBufferedImage(image);int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(h, w, type) ).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(270), w / 2, h / 2 + (w-h)/2);graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();return BufferedImageToImage(img);}//左转90度public static File rotateImage90(File file) throws Exception{BufferedImage bufferedimage = ImageIO.read(file);int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(h, w, type) ).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(270), w / 2, h / 2 + (w-h)/2);graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();ImageIO.write(img,"jpg",file);return file;}//右转90度public static File rotateImage270(File file) throws Exception{BufferedImage bufferedimage = ImageIO.read(file);int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(h, w, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(90), w / 2 - (w-h)/2, h / 2 );graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();ImageIO.write(img,"jpg",file);return file;}public static Image rotateImage270(Image image){BufferedImage bufferedimage = ImageToBufferedImage(image);int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int type = bufferedimage.getColorModel().getTransparency();BufferedImage img;Graphics2D graphics2d;(graphics2d = (img = new BufferedImage(h, w, type)).createGraphics()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(90), w / 2 - (w-h)/2, h / 2 );graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();return BufferedImageToImage(img);}//对转public static File rotateImage180(File file) throws Exception{BufferedImage bufferedimage = ImageIO.read(file);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()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(180), w / 2, h / 2 );graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();ImageIO.write(img,"jpg",file);return file;}public static Image rotateImage180(Image image){BufferedImage bufferedimage = ImageToBufferedImage(image);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()).setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);graphics2d.rotate(Math.toRadians(180), w / 2, h / 2 );graphics2d.drawImage(bufferedimage, 0, 0, null);graphics2d.dispose();return BufferedImageToImage(img);}/**** 图片镜像处理* @param file* @param FX 0 为上下反转 1 为左右反转* @return*/public static void imageMisro(File file,int FX){try {BufferedImage bufferedimage = ImageIO.read(file);int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int[][] datas = new int[w][h];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {datas[j][i] = bufferedimage.getRGB(j, i);}}int[][] tmps = new int[w][h];if (FX == 0) {for (int i = 0, a = h - 1; i < h; i++, a--) {for (int j = 0; j < w; j++) {tmps[j][a] = datas[j][i];}}} else if (FX == 1) {for (int i = 0; i < h; i++) {for (int j = 0, b = w - 1; j < w; j++, b--) {tmps[b][i] = datas[j][i];}}}for (int i = 0; i < h; i++){for (int j = 0; j<w ;j++){bufferedimage.setRGB(j, i, tmps[j][i]);}}ImageIO.write(bufferedimage, "jpg", file);} catch (Exception e) {e.printStackTrace();}}/** * 镜像处理,输入image和方式,返回翻转的新image* type = 0 表示上下翻转,type = 1 表示左右翻转*/public static Image imageMisro(Image image,int type ){try {//用到了自己写的方法BufferedImage bufferedimage = ImageToBufferedImage(image); int w = bufferedimage.getWidth();int h = bufferedimage.getHeight();int[][] datas = new int[w][h];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {datas[j][i] = bufferedimage.getRGB(j, i);}}int[][] tmps = new int[w][h];if (type == 0) {for (int i = 0, a = h - 1; i < h; i++, a--) {for (int j = 0; j < w; j++) {tmps[j][a] = datas[j][i];}}} else if (type == 1) {for (int i = 0; i < h; i++) {for (int j = 0, b = w - 1; j < w; j++, b--) {tmps[b][i] = datas[j][i];}}}for (int i = 0; i < h; i++){for (int j = 0; j<w ;j++){bufferedimage.setRGB(j, i, tmps[j][i]);}}Image newImage = (Image)bufferedimage;return newImage;//ImageIO.write(bufferedimage, "jpg", file);} catch (Exception e) {e.printStackTrace();}return null;}//Image转换成BufferedImagepublic static BufferedImage ImageToBufferedImage( Image image ){BufferedImage bufferedimage = new BufferedImage(image.getWidth(null), image.getHeight(null),BufferedImage.TYPE_INT_RGB); Graphics g = bufferedimage.createGraphics(); g.drawImage(image, 0, 0, null);//这里,大家可能会有疑问,似乎没有对bufferedimage干啥g.dispose(); //但是是正确的,g调用drawImage就自动保存了return bufferedimage;}//BufferedImage 转换成Image类型public static Image BufferedImageToImage( BufferedImage b ){return (Image)b;}}

下面展示用法:

package mypackage;import java.awt.*;import java.awt.image.*;import .URL;import javax.swing.*;public class Test extends JPanel{JFrame frame;Image image = new ImageIcon("hand2.jpg").getImage();public void paint( Graphics g ){g.drawImage(image, 0, 0,null);//之前的图片Image m = ImgRotate.imageMisro(image, ImgRotate.Left_Right_Reverse);g.drawImage(m, 200, 200, null);//水平翻转的图片Image mm = ImgRotate.rotateImage(m, 90);//这里只能填90,180,270g.drawImage(mm, 250, 0, null);}public Test(){frame = new JFrame();frame.add(this);frame.setSize(500,500);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}public static void main(String[] args) {new Test();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。