出现的问题:
我通过:BufferedImage bi=new BufferedImage(500,
500,BufferedImage.TYPE_INT_ARGB);
创建了一个bufferedImage对象,然后选择部分点对图片进行了处理,即不是所有的位置都进行bi.setRGB(x,y,pixel);操作
然后对初步处理的图片在进行处理,处理后写入本地png图片,
显示效果是这样的,我明明对白色的点进行了处理,怎么没有效果呢,
最终的解决方案:
由于我们在创建BufferedImage bi=new BufferedImage(500,
500,BufferedImage.TYPE_INT_ARGB);的时候
我们如果不对图片中的每一个点进行处理,那么他通过bi.getRGB(j,i);获取的值为0,
并不表示为白色像素点,但是当我们这个BufferedImage进行保存到本地的时候
ImageIO.write(newImage,"png",new File(newFilePath+"1.png")) ,当我们打开保存的图片的时候显示的未写入的图片的像素为白色,但其实并不是存在的,当我们再一次读取该图片的时候,改像素还是不存在.
import java.io.*;
import java.util.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
public class TestDemo {
public static void main(String[] args){
BufferedImage bi=new BufferedImage(100,
100,BufferedImage.TYPE_INT_ARGB);
int width=bi.getWidth();
int height=bi.getHeight();
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
int piex=bi.getRGB(j,i);
System.out.println(piex);
}
}
String newFilePath="C:\\Users\\Chen\\Desktop\\java3D\\3D极光模型\\整体设计\\img\\";
try{
ImageIO.write(bi,"png",new File(newFilePath+"11.png"));
}catch(Exception e){
e.printStackTrace();
}
try{
BufferedImage bii=ImageIO.read(new File(newFilePath+"11.png"));
int widths=bii.getWidth();
int heights=bii.getHeight();
for(int i=0;i<heights;i++){
for(int j=0;j<widths;j++){
int pies=bii.getRGB(j,i);
System.out.println("处理后的结果:"+pies);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
这个bug很容易被忽视,所以对bufferedImage进行处理的时候,小心再小心,你看到的可能并不是最终的.
配上获取rgb和整体像素值之间的转换关系代码
int pixel=bi.getRGB(j,i);
int r=(int)(pixel&0xff0000)>>16;
int g=(int)(pixel&0xff00)>>8;
int b=(int)(pixel&0xff);
int r;
int g;
int b;
int pixel=((0xFF<<24)|(r<<16)|(g<<8)|b);