java中RGB转灰度、bmp图像

2024-03-25

我的老师给我们布置了一个任务,要制作一个采用 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 文件格式

  • The BMP格式 http://en.wikipedia.org/wiki/BMP_file_format有一个标题。在进行图像转换之前,您应该跳过(或可能更新)标题。
  • 颜色表:假设一个“直接”调色板:颜色索引与 RGB 值相同。但这可能会有所不同......(BTW:如果图片使用颜色表,那么您只需更改它即可获得灰度图像......)
  • 每个像素有多少位?您假设它是每像素 24 位,采用 8-8-8 分布。这是不能保证的...标头提供了此信息。
  • 压缩:是的,图像可能会被压缩 - 您必须对其进行解码才能对像素值本身执行任何操作。

Loop

每个像素处理 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,然后转换为字节。

像素变换值范围

您对同一范围内的 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中RGB转灰度、bmp图像 的相关文章

  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 从 python 中的类调用函数 - 不同的方式

    EDIT2 谢谢大家的帮助 编辑 添加 staticmethod后 它可以工作 但是我仍然想知道为什么我在这里遇到类型错误 我刚刚开始使用 OOPS 并且对它完全陌生 我有一个非常基本的问题 关于从类中调用函数的不同方式 我有一个 test
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • Maven + Cobertura:无法找到[您的班级]。你指定了源目录吗?

    我有 MyMath 类 有两个简单的方法 multi 和 add 和测试类只会测试多种方法 public class MainTest Test public void testMultiply MyMath tester new MyMa
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • Java泛型类型

    当我有一个界面时 public interface Foo
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 非阻塞网络地址解析(gethostbyname 或 getaddrinfo)?

    使用经典的 nsswitch conf 配置 hosts files dns 尝试使用解析名称获取主机名 or 获取地址信息 如果 DNS 没有应答 或配置错误 可能需要一段时间 有没有办法在 nsswitch conf 中配置超时或使用管
  • C# 中的 Xamarin 跨平台应用程序包名称

    有没有办法以编程方式访问 Xamarin 可移植 C 代码中的应用程序包名称 命名空间 版本信息 Like this https stackoverflow com questions 8643221 android how to get
  • 如何在 firestore 中保存日期值

    type date 在 html 中保存为 firestore 中的字符串 在 html 文件中
  • 如何使用 maven 在 WAR、WEB-INF/lib 目录中包含特定的 jar

    这是我的 pom xml 尝试在 WEB INF lib 目录中创建一个包含特定 3 个库的 WAR 文件 我将它们包括在
  • 自定义提交按钮

    如何创建提交按钮 并在其上定义自定义标题以及自定义类样式 你可以使用submit http book cakephp org view 1431 submit or button http book cakephp org view 141
  • 导出/下载各种格式的闪亮传单地图?

    我创建了一个闪亮的仪表板来分析芝加哥的犯罪行为 因此 我还制作了芝加哥的传单地图 我们可以根据标记看到芝加哥哪个地区发生了多少犯罪事件 我有三个过滤器小部件 日期 犯罪类型和位置 基于这 3 个小部件 用户可以随意使用 并且每次都会使用所选
  • Tensorflow Estimator API:如何从输入函数传递参数

    我正在尝试添加类权重作为模型的超参数 但为了计算权重 我需要读取输入数据 这发生在 input fn 内部 然后传递给estimator fit 输出为input fn只是特征 标签应该具有相同的形状 num examples num fe
  • 在 VBScript 中格式化 XML 字符串

    我有一个未格式化的 xml 字符串 没有空格 我想创建一个 VBScript 函数 该函数接受该字符串作为其参数 并使用制表符和换行符格式化 XML 我仔细浏览了网络并接近了这个http blogs msdn com b robert mc
  • 在生产中运行 Django-Celery

    我构建了一个 Django Web 应用程序和一些 Django Piston 服务 用户使用 Web 界面提交一些数据 这些数据被 POST 到 Web 服务 而该 Web 服务又使用 Django celery 启动后台任务 使用man
  • TensorFlow 优化器中的 _get_hyper 和 _set_hyper 是什么?

    我看到它在 init 例如Adam https github com tensorflow tensorflow blob r2 2 tensorflow python keras optimizer v2 adam py L145优化器
  • 如何在 Jetpack Compose 中使用 Coil 制作缩写图标

    所以我使用 Coil 库进行图像处理 我注意到在占位符中它只需要一个 int 但是 如果用户没有头像或出现任何错误显示缩写 我想显示缩写 如下图所示 问题是 我是 jetpack compose 的新手 不确定如何实现这一目标 请参阅下面的
  • 当操作系统只是进程之一时,抢占式多任务处理如何工作?

    我现在正在阅读有关先发制人的多任务处理的材料 但我忘记了一件事 所有材料都暗示 操作系统以某种方式从 外部 中断了CPU上正在运行的进程 从而导致了上下文切换等 然而 我无法想象当操作系统的内核只是 CPU 上的另一个进程时 这将如何工作
  • 在 IE 中 XML 未通过响应对象正确发送到客户端

    我有一个上传控件 它从客户端调用处理程序 并将 xml 字符串发送回客户端 下面的代码在 Chrome 中工作正常 但在 IE 中将奇怪的 xml 发送回客户端 处理程序代码 public void ProcessRequest HttpC
  • 使用类似字典的结构访问 Pandas 数据框中的嵌套元素

    我有一个数据框如下 In 19 data frame Out 19 id hero 0 55c97138e5fecec26959f3b0 u info u id u 0001 u name u superman 为了过滤掉条目的名称字段 我
  • 分发 .pyc 文件有哪些限制?

    我已经开始使用 Python 开发商业应用程序 并且正在权衡如何分发该应用程序的选择 除了显而易见的 使用适当的商业许可证分发源代码 之外 我正在考虑仅分发 pyc文件没有对应的 py来源 但我对 Python 的兼容性保证还不够熟悉 不知
  • 如何设置事件的EventTarget

    如何设置事件目标 https developer mozilla org en docs Web API EventTarget一个事件的 var myObj foo bar var event new Event eventName ev
  • PEG规则识别函数原型

    我正在尝试创建一个可以解析 C 代码的解析器 我的用例是解析可能包含函数原型的缓冲区 我想将此函数名称推入符号表中 我是 Spirit 和 PEG 的新手 我正在尝试弄清楚如何编写可以识别函数原型的规则 这是我当前的实现 auto name
  • CancellationToken.ThrowIfCancellationRequested 之后出现故障与取消的任务状态

    通常我不会发布带有答案的问题 但这次我想引起一些注意 我认为这可能是一个晦涩但常见的问题 它是由这个问题 https stackoverflow com q 24346706 1768303 从那时起我回顾了自己的旧代码 发现其中一些也受到
  • UITextview打字属性不起作用

    我有 UITextView 我想将其行高设置为 50 0f 所以我使用打字属性 但没有任何效果 我的代码在 ViewDidAppear 方法中像这样 UITextView textView UITextView alloc initWith
  • java中RGB转灰度、bmp图像

    我的老师给我们布置了一个任务 要制作一个采用 640x480 bmp 彩色图像的课程 将其转换为灰度图像 我找到了一些有想法的资源 所以我做到了 但是有一个问题 因为它似乎使它不会给我错误 但输出没有出现 我认为这是我的代码 我的代码是 i