我正在尝试使用fileInputStream来读取图像并写出来生成另一个图像。我想读取像素,然后更改像素以获得左右翻转图像。但是,现在我只读取图像并直接写出来,我弄错了。使用超编辑后,这是我从前4个字节得到的:
原图:42 4D 7A 95
新图像:42 4D 7A 3F
似乎MSB为1的每个字节都已更改为 3F 。我知道Java中的每个数据类型都是有符号的,而且我已经尝试过对每个字节进行0xff。
public static void imageOut() {
try {
FileInputStream in = new FileInputStream(new File(getPath()));
int[] temp = new int[fSize];
int i = 0;
while (in.available() > 0) {
temp[i] = in.read();
i++;
}
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(getOutputPath()));
for (int j = 0; j < temp.length; j++) {
out.write(((byte)temp[j]));
}
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
是的,因为你正在写字节
out.write(((byte)temp[j]))
你需要写一个4字节的int。不要将int截断为字节
out.write(temp[j])
最终这不是编写图像的方法 - 这将重现文件,因此它可以用于此应用程序(只需复制文件)。但是如果你想改变像素并重写一个新图像,你需要使用imageio(或其他一些机制)来编写图像。
-
OutputStreamWriter写入字符;为什么不使用等价物:
FileOutputStream:您可以在读取时写入字节。