Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组件的ByteLookupTable顺序(JRE 7和8之间有所不同)_Java_Swing_Bufferedimage_Java 2d_Lookup Tables - Fatal编程技术网

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上进行测试。我认为字节顺序不重要。