gpt4 book ai didi

java - RGB到灰度,java中的bmp图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:55 25 4
gpt4 key购买 nike

我的老师给了我们一个任务,让我们制作一个需要 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);
}
}

最佳答案

除了@joni 提到的问题之外,还有一些问题。这个问题比它最初看起来的要深一些。

BMP文件格式

  • BMP format有一个标题。在进行图像转换之前,您应该跳过(或可能更新)标题。
  • 颜色表:您假设一个“直”调色板:颜色索引与 RGB 值相同。但这可能会有所不同...(顺便说一句:如果图片使用颜色表,那么您可以仅更改它以获得灰度图像...)
  • 每个像素有多少位?您假设它是每像素 24 位,呈 8-8-8 分布。这不能保证... header 提供此信息。
  • 压缩:是的,图像可能会被压缩 - 您必须对其进行解码才能对像素值本身进行任何处理。

循环

您为每个像素处理 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,再转换为byte。

像素变换取值范围

您对 saem 范围内的 3 个数字求和,并希望得到该范围内的一个数字。但是,您的权重并未反射(reflect)这一点:权重加起来应为 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

关于java - RGB到灰度,java中的bmp图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com