将数据类型 TYPE_4BYTE_ABGR 的字节数组转换为 BufferedImage

2023-12-20

我有一个类型为 TYPE_4BYTE_ABGR 的字节数组,并且我知道它的宽度和高度,我想将其更改为 BufferedImage,有什么想法吗?


最快的创建方法BufferedImage从字节数组中TYPE_4BYTE_ABGR形式,是将数组包装在DataBufferByte并创建一个交错的WritableRaster从那。这将确保没有额外的字节数组分配。然后创建BufferedImage来自光栅和匹配的颜色模型:

public static void main(String[] args) {
    int width = 300;
    int height = 200;

    int samplesPerPixel = 4; // This is the *4BYTE* in TYPE_4BYTE_ABGR
    int[] bandOffsets = {3, 2, 1, 0}; // This is the order (ABGR) part in TYPE_4BYTE_ABGR

    byte[] abgrPixelData = new byte[width * height * samplesPerPixel];

    DataBuffer buffer = new DataBufferByte(abgrPixelData, abgrPixelData.length);
    WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, samplesPerPixel * width, samplesPerPixel, bandOffsets, null);

    ColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_BYTE);

    BufferedImage image = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null);
    System.out.println("image: " + image); // Should print: image: BufferedImage@<hash>: type = 6 ...
}

但请注意,该图像将是“不受管理的”(某些硬件加速将被禁用),因为您可以直接访问像素阵列。

为了避免这种情况,请创建WritableRaster没有像素,并将像素复制到其中。这将使用两倍的内存,但会保持图像“受管理”,从而可能获得更好的显示性能:

// Skip creating the data buffer
WritableRaster raster = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, width, height, samplesPerPixel * width, samplesPerPixel, bandOffsets, null);
raster.setDataElements(0, 0, width, height, abgrPixelData);
// ...rest of code as above.

你甚至可以这样做(这可能更熟悉):

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

将数据类型 TYPE_4BYTE_ABGR 的字节数组转换为 BufferedImage 的相关文章

随机推荐

  • 使用迭代最近点 (ICP) 时如何在点云库 (PCL) 中标记 NULL 数据

    我正在尝试使用以下方法对齐 2 组点云迭代最近点 ICP 算法集成在点云库 PCL 我收到错误报告 指出找不到足够的对应点 我已经放宽了参数的条件 setEuclideanFitnessEpsilon 1 797e 5 setMaximum
  • 使用 CostModel 获取 LLVM IR 的 cpu 周期

    从LLVM 3 0开始 Analyse目录下有CostModel cpp 参考它的文档 它说 该文件定义了成本模型分析 它为 LLVM IR 提供了非常基本的成本估算 此分析使用代码生成器的服务来估算任何 IR 指令降低为机器指令时的成本
  • 对 System.Windows.Forms 的引用

    我正在使用 C 在 Excel 中执行某些命令 但是当我键入时 using System Windows Forms Visual Studio 无法识别它 当我添加引用时 出现此错误消息 无法添加对 System Windows Form
  • 地图初始化后是否可以更改 Google 地图样式?

    我了解如何使用自定义样式初始化地图 如下所示 var styles featureType water stylers visibility on color ffffff var mapOptions zoom 13 maxZoom 15
  • 如何在控件模板中的WPF中应用ListView列的MinWidth?

    继类似问题的回答之后here https stackoverflow com questions 852872 minwidth for listview column in wpf 我能够在 XAML 页面上设置 MinWidth 我想要
  • ncurses:为什么RGB颜色值范围是0 - 1000?

    对于 RGB 三元组中的每个值 RGB 颜色值范围为 0 255 为什么 ncurses 为 RGB 三元组中的每个值设置范围 0 1000 是否有一种简单的方法可以将 0 255 范围转换为 0 1000 范围 使颜色保持在 0 255
  • JIT 如何在运行时替换优化的机器代码?

    我正在浏览 OpenJDK 源代码 但找不到替换优化代码的地方 我想知道如何在保护模式下完成此操作 这不是操作系统应该阻止的某种自我修改代码吗 JITer 在堆或堆栈中分配空间 并将汇编代码插入其中 不 自我修改代码完全没问题 Virtua
  • 为什么过剩如此严重?

    尽管 openFrameworks 使用了 GLUT 但我看到了很多关于 GLUT 的不好的评论 Cinder 开发人员表示 他们希望尽可能远离 GLUT 那么它有什么不好呢 你永远不应该使用actual过剩 自 2001 年左右以来 它就
  • 我可以在该服务中动态创建的嵌套对象中设置该服务的 this.'something' 吗? (可能是范围问题)

    我有以下服务 它实际上有更多级别和元素 但我将其精简为我想要工作的一个示例 它根据 app data 文件夹中的 csv 文件动态地在其他对象中创建 javascript 对象 与这个问题最相关的行是this images images 在
  • 如何在 swift iOS 中为以下 JSON 响应创建模型类

    你好 我是 swift ios 的初学者 我的要求是必须显示对表列表的 Json 响应 我从网络服务收到响应 响应如下所示 我的要求是如何将模型类映射到数组以及如何在 tableList 中显示它们可以有人帮助我吗 Json响应 id 54
  • DataContext 未绑定在 Style.Trigger 中

    所以我有一些类似于以下的代码 请原谅任何拼写错误 我试图在帖子的 SO 编辑器中进行简化
  • pygame.event.get() 在线程内时不返回任何事件

    所以我有这段代码来处理吃豆人风格游戏的用户输入 def receiving inputs self while True events pg event get for event in events if event type pg KE
  • 如何在 VB.NET 中从资源播放 .wav

    我正在完善一个 VB NET 刽子手游戏 我添加了当你赢得比赛时火鸡狼吞虎咽的声音 当你获胜时 这是我的循环 Dim sndPing As New SoundPlayer My Resources turkey sndPing Play M
  • 使用 WS4J 进行句子相似度

    我想使用 ws4j 计算两个句子之间的相似度 我正在使用 WS4J 的在线演示 WS4J 在线演示 http ws4jdemo appspot com br I am using the default example sentences
  • 将 %20 替换为破折号

    当我回显下面的变量时 空格表示为 20 row title 所以 举例来说 如果 row title 等于 葡萄牙粉碎朝鲜 它的回响是Portugal 20Crushes 20North 20Korea 在我的源代码中 我如何替换每个 20
  • Netbeans JDK 校准 8.1

    如何使用 Netbeans 8 1 进行 JDK 校准 我用谷歌搜索了一些并找到了这个链接here https profiler netbeans org docs help 5 5 calibration html 它说 选择配置文件 g
  • 如何将 NSInteger 转换为 int?

    例如当通过一个value发消息给NSInteger像这样的实例 a value 它会导致 EXC BAD ACCESS 那么如何转换NSInteger to int 如果相关 则仅使用 Ta da NSInteger myInteger 4
  • 动态(取消)链接正在运行的(gstreamer)管道中的元素?

    gstreamer 文档中有大量有关构建和运行静态管道的示例 但是 关于更改 重新链接元素中的内容并不多live管道 当介质实际流动时 这绝对是可能的 所以问题是 在尝试此操作之前我应该 了解哪些 gstreamer 概念 机制 有什么需要
  • 创建对象实例而不调用构造函数?

    在 C 中 有没有一种方法可以实例化类的实例而不调用其构造函数 假设该类是公共的 并且是在第三方库中定义的 并且构造函数是内部的 我想要这样做的原因很复杂 但了解是否可以使用某种 C hackery 会很有帮助 注意 我特别不想调用任何构造
  • 将数据类型 TYPE_4BYTE_ABGR 的字节数组转换为 BufferedImage

    我有一个类型为 TYPE 4BYTE ABGR 的字节数组 并且我知道它的宽度和高度 我想将其更改为 BufferedImage 有什么想法吗 最快的创建方法BufferedImage从字节数组中TYPE 4BYTE ABGR形式 是将数组