我的老师给了我们一个任务,要制作一个640x480 bmp彩色图像的课程,将其转换成灰度图像,我找到了一些有想法的来源,所以我做了。但是有一个问题,因为它似乎使它导致它不会给我错误,但输出不会出现。我认为这是我的代码。我的代码是
import java.io.*;
public class Grayscale{
FileInputStream image;
FileOutputStream img;
byte[] datos;
int gray;
public Grayscale(String nombre)throws Exception{
this.image = new FileInputStream(nombre);
this.img = img;
this.datos = new byte[image.available()];
this.gray = gray;
}
public void gray()throws Exception{
image.read(datos);
img = new FileOutputStream("grayscaleprueba.bmp");
for (int i = 0; i<datos.length; i++){
gray = (byte)(datos[i]*0.3 + datos[i+1]*0.59 + datos[i+2]);
datos[i] = (byte)gray;
datos[i+1] = (byte)gray;
datos[i+2] = (byte)gray;
}
img.write(datos);
}
}
答案 0 :(得分:1)
除了@joni提到的那些问题之外,还有一些问题。这个问题比它最初看起来要深一些。
你为每个像素处理3个字节,然后以1为增量循环遍历文件。通过3D眼镜观看结果图像可能会非常有趣,但是会出现一些奇怪的图像。
for (int i = 0; i<datos.length; i+=3){ // increment by 3 instead of 1
gray = (byte)(datos[i]*0.3 + datos[i+1]*0.59 + datos[i+2]);
datos[i] = (byte)gray;
datos[i+1] = (byte)gray;
datos[i+2] = (byte)gray;
}
Java中的字节已签名。它从-128到127,所以你的算术无效。对于每个字节,我将它用作int,并在将它们与权重相加之前将其添加128。然后在求和之后,减去128,然后转换为字节。
你总结了saem范围内的3个数字,并希望获得该范围内的数字。但是,你的权重并不反映这一点:权重应该加起来为1.对于初学者,我会对所有值使用0.33(这不会给出完美的颜色权重,但在技术上应该有效)。
//using double to have some precision
double temp = datos[i]/3.0d + datos[i+1]/3.0d + datos[i]/3.0d;
gray = (byte)(Math.round(temp)-128); //rounding to Long, and converting to byt value range
答案 1 :(得分:0)
此代码存在一些问题:
available
方法仅告诉您有多少字节可立即使用,而无需实际读取磁盘。它可能会返回0。read
方法只读取部分数据。返回值告诉您实际读取的字节数。答案 2 :(得分:0)
您的代码中有很多内容无效。
read方法不读取整个文件。您必须在循环中使用此方法,直到它返回不正确的值:
while((byte = fis.read())!= -1){ //用byte做一些事情 }
您可以对文件的每个字节进行转换。我不知道任何可以使用的图片格式。即使是最简单的BMP格式,也有标题和填充。你应该阅读一下你想要使用的格式,因为它不会像迭代整个流那样简单,并且每个块的平均值为3个字节。