图片文件中存放中图片的分辨率,以及每个像素的色值等信息。我们经常看见如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
实现效果如下

&spm=1001.2101.3001.5002&articleId=95369108&d=1&t=3&u=d93a95bdec2f46b4a7e0939c0c3ba337)
468

被折叠的 条评论
为什么被折叠?



