如何在java中将int转换为uint8

如何在java中将int转换为uint8,java,matlab,int,type-conversion,Java,Matlab,Int,Type Conversion,我用Matlab编写了一个图像过滤器,我想把它翻译成java,以便使用我的android应用程序。如何将short或int转换为uint8数据格式 顺便说一句:我知道java中没有像uint8这样的类型 任何帮助都将不胜感激 Matlab: for iX = 1:imageX for iY = 1:imageY x(1:3) = input(iX,iY,:); output(iX, iY, :) = uint8(p1.*x.^5 + p2.*x.^4 +

我用Matlab编写了一个图像过滤器,我想把它翻译成java,以便使用我的android应用程序。如何将short或int转换为uint8数据格式

顺便说一句:我知道java中没有像uint8这样的类型

任何帮助都将不胜感激

Matlab:

for iX = 1:imageX
    for iY = 1:imageY
        x(1:3) = input(iX,iY,:);
        output(iX, iY, :) = uint8(p1.*x.^5 + p2.*x.^4 + p3.*x.^3 + p4.*x.^2 + p5.*x + p6);
    end
end
for (int iX = 0; iX < width; iX++) {
            for (int iY = 0; iY < height; iY++) {
                Arrays.fill(x, bitmap.getPixel(iX, iY));
                short total = 0;
                for (int i = 0; i < 3; i++) {
                    total +=p1[i] * Math.pow(x[i], 5) + p2[i]
                            * Math.pow(x[i], 4) + p3[i] * Math.pow(x[i], 3)
                            + p4[i] * Math.pow(x[i], 2) + p5[i] * x[i] + p6[i];
                }
                output.setPixel(iX, iY, total);
            }
        }
Java:

for iX = 1:imageX
    for iY = 1:imageY
        x(1:3) = input(iX,iY,:);
        output(iX, iY, :) = uint8(p1.*x.^5 + p2.*x.^4 + p3.*x.^3 + p4.*x.^2 + p5.*x + p6);
    end
end
for (int iX = 0; iX < width; iX++) {
            for (int iY = 0; iY < height; iY++) {
                Arrays.fill(x, bitmap.getPixel(iX, iY));
                short total = 0;
                for (int i = 0; i < 3; i++) {
                    total +=p1[i] * Math.pow(x[i], 5) + p2[i]
                            * Math.pow(x[i], 4) + p3[i] * Math.pow(x[i], 3)
                            + p4[i] * Math.pow(x[i], 2) + p5[i] * x[i] + p6[i];
                }
                output.setPixel(iX, iY, total);
            }
        }
for(int-iX=0;iX
这是java的一个不幸限制。这就是我要做的

  • 不要担心大小,使用char或int
  • 使用位掩码检查符号,为
    字节编写自己的加法包装。这会很慢,所以我会选择1。另一种方法是在操作期间强制转换为不同的数据类型。例如,在将截断版本序列化为字节数据类型之前使用int
    

  • 编译器将为您进行转换:

    int value = 115;
    byte transformed = (byte) value;
    // value == transformed => true
    
    警告:如果将int转换为字节,可能会丢失3*8位信息:

    int value2 = 357;
    byte transformed2 = (byte) value2;
    // value2 == transformed2 => false
    

    不要创建
    total
    。在matlab中,可以分别处理每个颜色分量。在java中执行同样的操作:

    for (int iX = 0; iX < width; iX++) {
            for (int iY = 0; iY < height; iY++) {
                Arrays.fill(x, bitmap.getPixel(iX, iY));
                // Result color components.
                int[] res = new int[3];
                short total = 0;
                for (int i = 0; i < 3; i++) {
                    res[i] = p1[i] * Math.pow(x[i], 5) + p2[i]
                            * Math.pow(x[i], 4) + p3[i] * Math.pow(x[i], 3)
                            + p4[i] * Math.pow(x[i], 2) + p5[i] * x[i] + p6[i];
                    // Make sure final value is in range [0, 255]
                    res[i] = Math.min(255, Math.max(0, res[i]));
                }
                output.setPixel(iX, iY, Color.rgb(res[0], res[1], res[2]);
            }
        }
    
    for(int-iX=0;iX
    java中没有未签名的数据类型,因此您必须使用其中的一种

    int,char,short,byte.
    

    在java中,这些都是有符号的数据类型,但在将一个数据类型值分配给另一个数据类型值时,请记住类型转换规则。

    在java中使用较长的类型,例如,
    short
    uint8
    int
    uint16
    long
    uint32

    或者对32位以下的所有无符号类型使用
    int
    ,对32位使用
    long

    当您对其进行操作时,最后执行操作:

    int i = 256 & 0xff;                             //uint8
    int i = 65536 & 0xffff;                         //uint16
    long i = (long) Math.pow(2, 32) & 0xffffffff;   //uint32;
    // And So on
    

    有点“浪费”因为它总是使用一半的类型长度。但在大多数情况下,这不会是一个严重的问题。

    java中的8位int是字节。您当前的java实现不起作用?@thang但它是有符号的。因此它可能会引起麻烦。不幸的是,java中total的值与matlab不同。@thang不!不!不!不!java中的8位int是有符号的!您能给出吗请举一个例子,原因是:java.lang.IllegalArgumentException:预期arg[0]为uint8,但如果提供了int32,则当尝试在tensorflow中执行此操作时,它不起作用。