IO流图片处理(图片颜色取反)

图片文件中存放中图片的分辨率,以及每个像素的色值等信息。我们经常看见如photoshop这类软件对图片进行旋转,扭曲,滤镜等处理,就是对图片中的二进制信息进行一个矩阵变换。下面我们试着做一个图片反相效果。
做这个处理前有两个问题需要考虑:
1)由于平时使用的jpg采用了压缩算法,所以图片中的每个字节并不是图片本身的像素信息,因此我们选择一个bmp格式的图片,来对每一位进行处理,以便达到我们想要的效果。
2)基本所有的二进制文件,图片,音频等文件都有一个头信息,存放该文件的一些基本信息,这些基本信息决定了这个文件是一个bmp图片或者是个gif图片或者是个jpg图片。因此我们对bmp图片做处理时不能破坏bmp文件的头信息。我们知道bmp文件很大,是因为他没有进行压缩,文件内容保存的是图片上对应的像素点的颜色值信息,因此我们队这些颜色值信息做一个处理,即可以得到一些特别的效果。
原文:https://blog.csdn.net/u012250875/article/details/78341874
原作者:puyf

package com.cm;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
	public static void imageFilter(File src, File dest) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(src);
			fos = new FileOutputStream(dest);
			int b = 0;
			int hasRead = 0;
			int headSize = 8 * 12;
			while ((b = fis.read()) != -1) {
				hasRead++;
				if (hasRead > headSize) {
					fos.write(-b);
				} else {
					fos.write(b);
				}
			}
		} catch (FileNotFoundException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			try {
				fos.close();
			} catch (IOException e) {
				throw new RuntimeException(e);
			} finally {
				try {
					fis.close();
				} catch (IOException e) {
					throw new RuntimeException(e);
				}

			}

		}
	}

	public static void main(String[] args) {
		File src = new File("d:\\a\\a1.dib");
		File dest = new File("d:\\a\\1_copy.dib");
		imageFilter(src, dest);// 800k的文件执行时间大概好几秒,比较长,这里只是做个示意处理
	}
}

上面代码中写数据时,如果字节长度小于headSize则原样输出(headSize我这里取的是12个字节,bmp头信息具体多大我并没有去查询。如果取太小头信息被破坏,bmp文件将不是bmp文件。因此取几十个字节只要保证头信息完整即可。),大于headSize的部分进行一个处理,我们对颜色值取反。
实现效果:在这里插入图片描述
图片原址:(https://img-blog.csdnimg.cn/20190710193222551.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NtNDAwMg==,size_16,color_FFFFFF,t_70
实现效果如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值