java彩色图片转灰色图片

之前不知道什么原因,需要把彩色图片转到灰色图片,所以找了彩色RGB转到灰色RGB的计算方法,然后在java的bufferedimage里直接有转成灰色的,这里就两种都提供

首先,从网上找到的彩色RGB转灰色RGB的计算有几种,如下:

1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,
形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了

java的bufferedimage可以直接在构造函数指定BufferedImage.TYPE_BYTE_GRAY,来提供灰色图片,具体代码如下:

/**
 * 彩色图片转灰色图片
 * 
 * @author kime
 *
 */
public class ImageGray {
	private BufferedImage srcim=null;
	private BufferedImage grayim=null;
	private String imageType="jpg";
	
	public void read(InputStream in)throws IOException{
		srcim= ImageIO.read(in);
	}
	/**
	 * 用java自带的功能即可
	 * @throws IOException
	 */
	public void changeGray() throws IOException{
		if (srcim==null) {
			throw new IOException("Must read src-image first");
		}
		int width=srcim.getWidth();
		int height=srcim.getHeight();
		grayim=new BufferedImage(srcim.getWidth(),srcim.getHeight(), BufferedImage.TYPE_BYTE_GRAY);  //最后一个参数,就是gray的
		Graphics graphics=grayim.getGraphics();
		graphics.drawImage(srcim, 0, 0, width, height,null);
		graphics.dispose();
	}
	/**
	 * 自己转换rgb的值到gray的值 
	 * 
	 * 我们可以通过下面几种方法,将其转换为灰度:
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,
形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了
	 * 
	 * 
	 * 这里采用第五种,取绿色
	 * 
	 * @throws IOException
	 */
	public void changeGray2() throws IOException{
		if (srcim==null) {
			throw new IOException("Must read src-image first");
		}
		int width=srcim.getWidth();
		int height=srcim.getHeight();
		grayim=new BufferedImage(srcim.getWidth(),srcim.getHeight(), BufferedImage.TYPE_INT_RGB);  //最后一个参数,就是gray的
			
		int rgb=0;
		int g=0;
		for (int i = 0; i < width; i++) {
			for (int j = 0; j < height; j++) {
				rgb=srcim.getRGB(i, j);
				g=(rgb>>8)&0xff;
				rgb=(rgb&0xff000000)  |  ((g&0xff)  <<16) | ((g&0xff) <<8) | (g&0xff);
				grayim.setRGB(i, j, rgb);
			}
		}
	}
	
	public void setGrayImageType(String imageType){
		this.imageType=imageType;
	}
	public void write(OutputStream out)throws IOException{
		ImageIO.write(grayim, imageType, out);
	}
	
	public static void main(String a[]){
		ImageGray imageGray=new ImageGray();
		InputStream in=null;
		OutputStream out=null;
		try {
			in = new FileInputStream("/tmp/input.jpg");
			imageGray.read(in);
			in.close();
			
			imageGray.changeGray();
			
			out=new FileOutputStream("/tmp/out.jpg");
			imageGray.setGrayImageType("jpg");
			imageGray.write(out);
			out.close();
			
			imageGray.changeGray2();			
			out=new FileOutputStream("/tmp/out2.jpg");
			imageGray.setGrayImageType("jpg");
			imageGray.write(out);
			out.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();		
		}finally{
			if (in!=null) {
				try {
					in.close();
				} catch (IOException e) {
				}
			}
			if(out!=null){
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		}
	}
}

» 本文链接地址:https://www.xidige.com/907

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论222人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告