昨天研究了一下图片的旋转和透明化问题,以为备忘,记录如下:
旋转
//加载图片
Image bodyImage = Toolkit.getDefaultToolkit().getImage(Hhh.class.getClassLoader()
.getResource("images/tank/body.png"));
BufferedImage bufImage = null; //建立缓冲图片
Graphics2D g2D = null; //获取缓冲图片的画笔Graphics2D
AffineTransform trans = new AffineTransform(); //建立坐标变换用的类
bufImage = new BufferedImage(64,64,BufferedImage.TYPE_4BYTE_ABGR); //初始化图片缓冲区
g2D = bufImage.createGraphics(); //获取该缓冲区的画笔
trans.rotate(Math.PI,32,32); //将坐标转换器设置为旋转pi弧度(180)度,根据中心坐标32,32旋转,这个坐标一般是图片缓冲坐标的一半
g2D.setTransform(trans); //设置画笔为旋转180度的画笔
g2D.drawImage(bodyImage, null, null); //使用画笔将图片旋转后的图形画到图片缓冲bufImage中
File out = new File("d:/TEST/bodytest.png");
ImageIO.write(bufImage, "png", out); //将旋转后的图片输出到文件
透明化,原理:使用BufferedImage的逐点轮询方法,获得每个点的RGB,然后根据条件处理:
package tools;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import javax.imageio.ImageIO;
public class ImageLucency {
public static void main(String[] args) {
try {
//读取图片
BufferedImage bufIBody = ImageIO.read(new FileInputStream("d:/TEST/body2.png"));
int alpha = 0; //alpha取值0-100,0表示完全透明
int rgb;
//i表示BufferedImage的x坐标,j表示BufferedImage的y坐标
for(int i = bufIBody.getMinX(); i < bufIBody.getWidth(); i++){
for(int j = bufIBody.getMinY(); j< bufIBody.getHeight(); j++){
rgb = bufIBody.getRGB(i, j);
if(i < 15 || i > 48 || j < 13 || j> 50){ //指定区域透明化
rgb = ((alpha) << 24) | (rgb & 0x00ffffff); //公式,位运算
}
bufIBody.setRGB(i, j, rgb);
/*
* 也可以取出值后根据R,G,B的值对颜色进行处理
int R =rgb & 0xff0000 >>> 16;
int G= rgb & 0xff00 >>> 8;
int B= rgb & 0xff;
if(B < 150){
B += 100;
}
System.out.println(R + ":" + G + ":" + B);
rgb = new Color(R, G,B).getRGB();
//rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
bufIBody.setRGB(i, j, rgb);
*/
}
}
File out = new File("d:/TEST/bodytest.png");
ImageIO.write(bufIBody, "png", out); //将透明化的图片输出到文件
}catch (Exception e) {
e.printStackTrace();
}
}
}
/*将白色进行透明的方法
int rgb = bufferedImage.getRGB(j2, j1);
int R =(rgb & 0xff0000 ) >> 16 ;
int G= (rgb & 0xff00 ) >> 8 ;
int B= (rgb & 0xff );
if(((255-R)<30) && ((255-G)<30) && ((255-B)<30)){
rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
*/