Java 组件的ByteLookupTable顺序(JRE 7和8之间有所不同)
我正在使用Java 组件的ByteLookupTable顺序(JRE 7和8之间有所不同),java,swing,bufferedimage,java-2d,lookup-tables,Java,Swing,Bufferedimage,Java 2d,Lookup Tables,我正在使用ByteLookupTable将颜色查找表应用于buffereImage。滤波前,图像中每个像素的RGB分量相同。过滤后,应根据查找表对其着色。所有这些都按预期工作,除了关于如何对进入查找表的组件进行排序的混淆 我发现大端系统和小端系统之间的顺序不同(这是有道理的),但同一系统上的JRE 7和8之间的顺序也不同。根据操作系统的不同,运行以下测试将在Oracle JRE 7和8之间产生不同的输出 OS X Java 7: 00000011 00000010 00000001 000
ByteLookupTable
将颜色查找表应用于buffereImage
。滤波前,图像中每个像素的RGB分量相同。过滤后,应根据查找表对其着色。所有这些都按预期工作,除了关于如何对进入查找表的组件进行排序的混淆
我发现大端系统和小端系统之间的顺序不同(这是有道理的),但同一系统上的JRE 7和8之间的顺序也不同。根据操作系统的不同,运行以下测试将在Oracle JRE 7和8之间产生不同的输出
OS X Java 7: 00000011 00000010 00000001 00000100
OS X Java 8: 00000100 00000001 00000010 00000011
Windows Java 7: 00000100 00000001 00000010 00000011
Windows Java 8: 00000100 00000001 00000010 00000011
Linux Java 7: 00000011 00000010 00000001 00000100
Linux Java 8: 00000100 00000001 00000010 00000011
我的问题是,如果不是简单地确定本机字节顺序,如何确定使用哪个顺序,我还需要哪些其他信息来确定使用哪个顺序
public class Test {
public static void main(final String[] args) {
final byte[] lutArrayG = new byte[256];
final byte[] lutArrayR = new byte[256];
final byte[] lutArrayA = new byte[256];
final byte[] lutArrayB = new byte[256];
Arrays.fill(lutArrayG, (byte) 1);
Arrays.fill(lutArrayR, (byte) 2);
Arrays.fill(lutArrayA, (byte) 3);
Arrays.fill(lutArrayB, (byte) 4);
final byte[][] lutArrays = new byte[4][];
// what is the correct order to use? this one...
lutArrays[0] = lutArrayG;
lutArrays[1] = lutArrayR;
lutArrays[2] = lutArrayA;
lutArrays[3] = lutArrayB;
// or this one...
//lutArrays[1] = lutArrayG;
//lutArrays[0] = lutArrayR;
//lutArrays[3] = lutArrayA;
//lutArrays[2] = lutArrayB;
final ByteLookupTable lut = new ByteLookupTable(0, lutArrays);
final LookupOp lutOp = new LookupOp(lut, null);
final BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
final BufferedImage imageFiltered = lutOp.filter(image, null);
final int value = imageFiltered.getRGB(0, 0);
System.out.println(makeNiceBinaryString(value));
}
public static String makeNiceBinaryString(final int value) {
final StringBuffer sb = new StringBuffer(String.format("%32s", Integer.toBinaryString(value)).replace(' ', '0'));
sb.insert(sb.length() - 32, " ");
sb.insert(sb.length() - 24, " ");
sb.insert(sb.length() - 16, " ");
sb.insert(sb.length() - 8, " ");
return sb.toString();
}
}
下面是我当前确定使用哪个顺序的方法。看起来很可怕。该应用程序使用嵌入式JRE 7。然而,我有一个Linux用户,他决定使用自己的Java 8 JRE——然后他遇到了这个bug
boolean useBigEndian = ByteOrder.nativeOrder().toString().equals("BIG_ENDIAN");
if (Platform.UNIX) {
useBigEndian = !useBigEndian; // I have no idea why this is so ???
}
if (Platform.MAC && Platform.JAVA7) {
useBigEndian = !useBigEndian;
}
if (useBigEndian) {
lutArray[0] = lutArrayG = new byte[256];
lutArray[1] = lutArrayR = new byte[256];
lutArray[2] = lutArrayA = new byte[256];
lutArray[3] = lutArrayB = new byte[256];
} else {
lutArray[1] = lutArrayG = new byte[256];
lutArray[0] = lutArrayR = new byte[256];
lutArray[3] = lutArrayA = new byte[256];
lutArray[2] = lutArrayB = new byte[256];
}
我如何才能确定正确的使用顺序,而不必对系统属性进行这种混乱的检查?可能
键入4BYTE\u ABGR
?可能会因为交换而变慢。看起来有点像一个bug“创建的映像与JDK1.1和早期版本中创建的映像一致。”正如为TYPE_INT_ARGB
指定的,似乎是Java 7错了。G,R,A,B的顺序就是。。。奇怪的LUT的顺序应为R、G、B、A(因为在TYPE\u INT\u ARGB
中只有一个波段,但在颜色空间中有3个颜色分量+1个alpha分量)。这在Java1.6和1.8中都是如此(仅在OSX上测试)。对于TYPE_BYTE_4ABGR
,顺序为A、B、G、R(作为波段),并且在所有版本中都是一致的。明天我将发布一个示例程序,也许有人可以在Windows/Linux上进行测试。我认为字节顺序不重要。也许键入4BYTE\u ABGR
?可能会因为交换而变慢。看起来有点像一个bug“创建的映像与JDK1.1和早期版本中创建的映像一致。”正如为TYPE_INT_ARGB
指定的,似乎是Java 7错了。G,R,A,B的顺序就是。。。奇怪的LUT的顺序应为R、G、B、A(因为在TYPE\u INT\u ARGB
中只有一个波段,但在颜色空间中有3个颜色分量+1个alpha分量)。这在Java1.6和1.8中都是如此(仅在OSX上测试)。对于TYPE_BYTE_4ABGR
,顺序为A、B、G、R(作为波段),并且在所有版本中都是一致的。明天我将发布一个示例程序,也许有人可以在Windows/Linux上进行测试。我认为字节顺序不重要。