Flask接口签名sign原理与实例代码浅析
317
2023-01-14
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 OouaPiBufferedImage 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 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 &OouaPilt; 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 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(); } }
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 &OouaPilt; 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 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(); } }
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();
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~