- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解如何从 short[]
获取 RGBA 值,该值是从 bufferedImage.getRaster().dataBuffer.getData()
获取的,如果 dataBuffer
是DataBufferUShort
的一个实例。
如何将这些值(甚至可以是 -30000)转换为 0..255?如果 dataBuffer
是 DataBufferByte
的实例,我可以简单地制作如下内容:
result[i] = (array[i] < 0) ?
array[i] + 256 :
array[i];
但是我应该如何处理DataBufferUShort
?某些 PNG 图像具有此类型,而不是预期的 DataBufferByte
。
getType() 返回 TYPE_CUSTOM。这是图像:/image/YwmkO.png
最佳答案
DataBufferUShort
可以容纳多种类型的样本,因此您首先需要确定您拥有哪些数据。以下是最常见的:
如果图像数据表示 16 位灰度样本,您只需按比例缩小每个值即可获得 8 位灰度值。您可以通过将值右移 8 位来实现这一点。
DataBufferUShort dataBuffer;
short[] data = dataBuffer.getData();
byte[] gray = new byte[data.length];
for (int i = 0; i < data.length; i++) {
gray[i] = (byte) ((data[i] & 0xff00) >> 8);
}
如果图像数据表示每个样本 16 位 (A)RGB 值,您可以执行与上面相同的操作,每个像素将只有 3 个(或 4 个,如果有 alpha)样本或数组元素,而不是一个。
如果数据表示每个样本 ARGB 16 位(您的样本似乎就是这种情况),您还可以转换为 int
打包 ARGB 样本,如下所示:
DataBufferUShort dataBuffer;
short[] data = dataBuffer.getData();
int[] argb = new byte[data.length / 4];
for (int i = 0; i < data.length; += 4) {
int a = (data[i ] & 0xff00) >> 8;
int r = (data[i + 1] & 0xff00) >> 8;
int g = (data[i + 2] & 0xff00) >> 8;
int b = (data[i + 3] & 0xff00) >> 8;
argb[i / 4] = a << 24 | r << 16 | g << 8 | b;
}
如果图像数据表示 15/16 位 RGB(例如 TYPE_USHORT_555_RGB
或 TYPE_USHORT_565_RGB
),则必须将 RGB 值缩放至完整 8 位/样本范围。像这样的东西:
DataBufferUShort dataBuffer;
short[] data = dataBuffer.getData();
byte[] rgb = new byte[data.length * 3];
for (int i = 0; i < data.length; i++) {
int shortRGB = data[i] & 0xffff;
// Assuming 5 bit R, 5 bit G, 5 bit B, using the lower 15 bits
rgb[i * 3 + 0] = ((((shortRGB & 0x7C00) >> 10) + 1) * 8) - 1;
rgb[i * 3 + 1] = ((((shortRGB & 0x03E0) >> 5) + 1) * 8) - 1;
rgb[i * 3 + 2] = ((((shortRGB & 0x001F) ) + 1) * 8) - 1;
}
对于 565 RGB 甚至 4444 ARGB(在某些 Android 设备中使用),过程非常相似。
关于java - (DataBufferUShort).getData() 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095924/
我无法理解如何从 short[] 获取 RGBA 值,该值是从 bufferedImage.getRaster().dataBuffer.getData() 获取的,如果 dataBuffer 是Da
(Oracle Java 1.7、Eclipse Kepler、Ubuntu 12.04 64 位) 我需要从 ByteBuffer 创建一个 DataBufferUShort,但我的所有尝试在运行时
我有一个 BufferedImage.TYPE_USHORT_GRAY (DataBufferUShort) 类型的 BufferedImage,我想将其转换为 BufferedImage.TYPE_
我是一名优秀的程序员,十分优秀!