评论

收藏

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

编程语言 编程语言 发布于:2021-10-05 18:04 | 阅读数:242 | 评论:0

这篇文章主要为大家详细介绍了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();
 
 }
 
 
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/qq_39627843/article/details/86497370

关注下面的标签,发现更多相似文章