java实现图片水平和垂直翻转效果

 更新时间:2019年01月24日 09:39:33   作者:Bowen_Yang  
这篇文章主要为大家详细介绍了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 2011-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转换成BufferedImage
 public 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 java.net.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,270
 g.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();
 
 }
 
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 最全JVM调优步骤和参数及配置

    最全JVM调优步骤和参数及配置

    这篇文章主要给大家介绍了关于JVM调优的相关资料,JVM调优是指对Java虚拟机(JVM)进行优化,以提高Java程序的性能和运行效率,文中介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • SpringBoot实现多个ApplicationRunner时部分接口未执行问题

    SpringBoot实现多个ApplicationRunner时部分接口未执行问题

    这篇文章主要介绍了SpringBoot实现多个ApplicationRunner时部分接口未执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java手把手必会的实例汉诺塔讲解练习

    Java手把手必会的实例汉诺塔讲解练习

    汉诺塔,传说神在创造世界的时候做了三根金刚石柱子,并在一个教塔里留下了三根金刚石棒,第一根上面从上到下套着64个按从小到大排列的金盘,神命令庙里的众僧将它们一个个地从这根金刚石棒搬到另一根金刚石棒上,大盘不能放在小盘上。最后64个金盘仍然要按从小到大排列
    2021-09-09
  • Java 读写锁实现原理浅析

    Java 读写锁实现原理浅析

    这篇文章主要介绍了Java 读写锁实现原理浅析,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • java 字符串词频统计实例代码

    java 字符串词频统计实例代码

    java 字符串词频统计实例代码,需要的朋友可以参考一下
    2013-03-03
  • 详解log4j.properties的简单配置和使用

    详解log4j.properties的简单配置和使用

    本篇文章主要介绍了详解log4j.properties的简单配置和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java的Atomic原子类详解

    Java的Atomic原子类详解

    这篇文章主要介绍了Java的Atomic原子类详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • mybatis-plus的自动填充时间的问题(添加到数据库的时间比当前时间多4个小时)

    mybatis-plus的自动填充时间的问题(添加到数据库的时间比当前时间多4个小时)

    这篇文章主要介绍了mybatis-plus的自动填充时间的问题(添加到数据库的时间比当前时间多4个小时),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Maven多模块工程Module开发(图文教程)

    Maven多模块工程Module开发(图文教程)

    这篇文章主要介绍了Maven多模块工程Module开发(图文教程),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 详解java接口基础知识附思维导图

    详解java接口基础知识附思维导图

    这篇文章主要介绍了java接口基础知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论