BufferedImage getRGB 与 Raster getSample

2023-11-22

我正在尝试用 Java 进行一些图像处理。我使用 ImageIO 库来读取和写入图像。我可以通过以下两种方式读取图像像素值(可能还有其他方法不知道)。

  1. 使用 BufferedImage 的 getRGB 方法:

    像素 = image.getRGB(x,y);

  2. 使用 Raster 的 getSample 方法:

    WritableRaster 栅格 = image.getRaster();
    像素 = raster.getSample(x,y,0);

上述两种方法有什么区别?


1:第一种方法将始终返回 int ARGB 格式和 sRGB 颜色空间中的像素。无论图像的内部表示如何。这意味着除非图像的内部表示是TYPE_INT_ARGB,必须进行一些转换。这有时很有用,因为它是可预测的,但通常速度相当慢。例如,色彩空间转换的成本相当高。此外,如果图像的精度高于每个样本 8 位和/或每个像素 4 个样本,则会发生精度损失。考虑到您的用例,这可能是可接受的,也可能是不可接受的。

2:第二种方法可能会为您提供像素值,但并非在所有情况下都如此,因为它会为您提供频段 0(第一个频段)在 (x,y) 处的样本值。为了TYPE_INT_ARGB这将与像素值相同。为了TYPE_BYTE_INDEXED这将是查找表中使用的索引(您需要查找它才能获取像素值)。为了TYPE_3BYTE_BGR这只会为您提供蓝色值(您需要将其与带 1 和带 2 中的样本结合起来以获得完整的像素值)。其他类型依此类推。对于内部未表示为 int 的样本,会发生数据类型转换(在极少数情况下会发生精度损失)。它可能对你有用,但我从来没有多大用处getSample(...)方法。

相反,我建议您研究一下我认为是获取像素数据的最快方法。那就是使用getDataElements method:

Object pixel = null; // pixel initialized on first invocation of getDataElements

for (y) {
    for (x) {
       pixel = raster.getDataElements(x, y, pixel);
    }
}

这将为您提供数据缓冲区中的“本机”值,无需任何转换。

然后,您需要对每种传输类型进行特殊处理(请参阅DataBufferclass)你想要支持,也许是非标准类型的常见后备。

对于像素值与标准化 RGB 值,这将具有与方法 2 相同的“问题”,因此您可能需要“手动”转换/查找。


一如既往,哪种方法更好取决于具体情况。您必须查看每个用例,并决定什么更重要。轻松/简单,或者最好的性能(或者也许最好的质量?)。

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

BufferedImage getRGB 与 Raster getSample 的相关文章

随机推荐

  • 计算地理邻近度的公式

    我需要在我的应用程序中实现地理邻近搜索 但我对使用的正确公式感到非常困惑 经过在网络和 StackOverflow 中的一些搜索 我发现解决方案是 Use the 半正矢公式 Use the Great Circle Distance Fo
  • .net 中的转换:本机 Utf-8 <-> 托管字符串

    我创建了这两种方法来将本机 utf 8 字符串 char 转换为托管字符串 反之亦然 下面的代码完成了这个工作 public IntPtr NativeUtf8FromString string managedString byte buf
  • 找不到版本 GLIBCXX_3.4.11(buildW.mexglx 需要)

    我正在尝试通过 matlab 编译 C ubuntu 项目here 当我在使用 make 命令编译后尝试使用它时 出现以下错误 Invalid MEX file fashionista v0 2 lib bsr buildW mexglx
  • 从输入迭代器创建 C++ std::string 的性能

    我正在做一些非常简单的事情 将整个文本文件从磁盘放入std string 我当前的代码基本上是这样做的 std ifstream f filename return std string std istreambuf iterator
  • 未找到 Android SSL 连接的信任锚

    我正在尝试连接到运行 godaddy 256 位 SSL 证书的 IIS6 机器 但收到错误 java security cert CertPathValidatorException Trust anchor for certificat
  • 使用 PHP 创建 ping 正常运行时间服务

    我有一台可以使用 PHP 的服务器和一个可以从 Internet ping 通的路由器 我想编写一个 PHP 脚本 每 5 分钟向路由器发送一次 ping 结果如下 如果 ping 成功 则不会发生任何事情 如果 ping 失败 则会等待几
  • 当另一个视图控制器显示在 UIPresentationController 之上时,UIPresentationController 会更改大小

    我正在使用 UIPresentationController 展示一个模式视图控制器 我使用以下方法将presentedView 的框架设置为小于containView 的边界 override func frameOfPresentedV
  • mutex.Lock() 如何知道要锁定哪些变量?

    我是个新手 所以请温柔一点 所以我已经在我的一些代码中使用互斥体几周了 我理解其背后的概念 锁定对特定资源的访问 与其交互 读或写 然后再次为其他资源解锁 我使用的互斥体代码主要是复制粘贴调整 代码运行了 但我仍在尝试了解它的内部工作原理
  • 按日期对文件排序

    我在网上找到了这个目录检查代码并稍微修改了一下 这样它就会打印出添加的文件 有一个浮标时不时地向我发送读数 但有时连接会丢失 而不是一个文件 而是发送多个文件 我需要该程序按创建日期对它们进行排序 有没有办法做到这一点 import os
  • 为什么 Java 和 C# 有位移运算符?

    整数乘法 暂时忘记除法 之间的差异是否仍然有利于移位 如果是的话 差异有多大 它看起来只是一个低级优化 即使您想要它 在大多数情况下 C Java 字节码编译器或 jit 不应该捕获它吗 注意 我测试了 C 的编译输出 使用 gmcs Mo
  • 设置 UITextField 的最大字符长度

    如何设置一个文件的最大字符数UITextField当我加载一个iPhone SDK时UIView 虽然UITextField类没有最大长度属性 通过设置文本字段的值来获得此功能相对简单delegate并实现以下委托方法 Objective
  • 在运行时,如何测试属性是否是只读的?

    我正在自动生成代码 根据配置 文本框 dateTimePickers 等 创建 winform 对话框 这些对话框上的控件是从保存的数据集填充的 需要设置和获取各种控制对象 自定义或其他 的属性 Upon opening of form p
  • x86 CPU 有多少条内存屏障指令?

    我发现 x86 CPU 有以下内存屏障指令 mfence lfence and sfence x86 CPU 是否只有这三个内存屏障指令 还是还有更多 sfence 上交所1 和mfence lfence SSE2 是唯一以其内存栅栏 屏障
  • Oracle 基于列值的唯一约束

    我有以下独特的约束 dup Checklist QNum UNIQUE QUESTION NO IS ACTIVE 我试图防止两个问题在活动状态下具有相同的问题编号 IS ACTIVE 值 1 一切看起来都很好 直到我不得不第二次回答一个问
  • 如何持续通知用户 Perl CGI 脚本的进度?

    我的 Apache 服务器的 cgi bin 文件夹中有这个 Perl 脚本 usr bin perl use strict use warnings 1 print Content type text html r n r n print
  • GitHub 操作发布标签

    在 GitHub 中创建发布后 我会触发 GitHub 操作 在此操作中 我想从发布中获取一些数据 这可能吗 例如 我想获取标签 然后使用这个标签作为NuGet包版本 有没有办法从工作中获取这些数据 您可以使用 github ref or
  • 如何获取从 iPhone 的照片库中选取的图像的名称?

    我正在从 iphone 应用程序的照片库中挑选一张图像 我将如何检索实际的图像名称 在 h类中 UIImageView imageView UIButton choosePhotoBtn 在 m 级 IBAction getPhoto id
  • 使用 Java 的递归表达式计算器

    我将编写一个仅执行加法和减法的表达式计算器 我有一个简单的算法可以做到这一点 但是 我有一些实施问题 我将表达式视为 它是一个字符串
  • Google Analytics API 创建新属性

    我遇到的问题是 当我尝试使用 Google Analytics Api 插入新的网络属性时 出现错误 reason 权限不足 message 您的项目无权访问此功能 即使我使用该页面时也是如此 https developers google
  • BufferedImage getRGB 与 Raster getSample

    我正在尝试用 Java 进行一些图像处理 我使用 ImageIO 库来读取和写入图像 我可以通过以下两种方式读取图像像素值 可能还有其他方法不知道 使用 BufferedImage 的 getRGB 方法 像素 image getRGB x