BufferedImage之你想想不到的数据问题

出现的问题:

我通过: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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值