首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RGB到Grayscale,bmp图像在java中

RGB到Grayscale,bmp图像在java中
EN

Stack Overflow用户
提问于 2013-09-11 14:35:59
回答 3查看 3K关注 0票数 3

我的老师给了我们一个任务,让我们制作一个640x480 bmp彩色图像的课程,把它转换成灰度图像,我找到了一些有想法的来源,所以我就做了。但有一个问题,因为它似乎使它,因为它没有给我错误,但输出没有出现。我想这是我的密码。我的代码是

代码语言:javascript
复制
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);
}
}
EN

回答 3

Stack Overflow用户

发布于 2013-09-11 14:48:52

除了@joni提到的那些问题之外,还有一些问题。这个问题比最初看上去的要深一点。

BMP文件格式

  • BMP格式有一个标头。在进行图像转换之前,您应该跳过(或者更新)标头。
  • 颜色表:假定为“直”调色板:颜色索引与RGB值相同。但这可能不一样..。(BTW:如果图片使用颜色表,那么您只能修改它以获得灰度图像.)
  • 每像素有多少位?您假设它是每像素24位,分布在8-8-8。这不是护卫..。标题提供了这个信息。
  • 压缩:对,图像可能被压缩-你必须解码它来做任何事情与像素值本身。

循环播放

处理每个像素的3个字节,然后以1的增量遍历文件。通过3D眼镜观看得到的图像可能非常有趣,但也意味着出现了一些奇怪的图像。

代码语言:javascript
复制
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 (这不能给出完美的颜色权重,但在技术上应该有效)。

代码语言:javascript
复制
    //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
EN

Stack Overflow用户

发布于 2013-09-11 14:41:05

这个代码有几个问题:

  1. available方法只告诉您立即可用的字节数,而不必实际从磁盘读取。它很可能返回0。
  2. read方法只读取数据的一部分。返回值告诉您实际读取的字节数。
  3. 您不关闭输出流。如果不关闭输出,就无法保证向输出文件写入任何内容。
票数 0
EN

Stack Overflow用户

发布于 2013-09-11 14:50:55

在您的代码中有很多东西不能工作。

  • 可用方法不一定返回文件中的字节数。您应该使用动态容器来处理从输入文件中读取的数据。
  • read方法不读取整个文件。必须在循环中使用此方法,直到它返回不正确的值为止: 而((字节= fis.read()) != -1) {//用字节}做某事
  • 对文件的每个字节进行转换。我不知道任何图片的格式,这是可行的。有标题和填充,即使是在最简单的BMP格式。您应该阅读您想要使用的格式,因为它不会像遍历整个流那样简单,并且使每个块平均为3个字节。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18744123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档