如何在java中将int转换为uint8

时间:2013-01-18 08:43:21

标签: java matlab int type-conversion

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

BTW:我知道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);
            }
        }

5 个答案:

答案 0 :(得分:3)

在Java中使用较长的类型,例如short&lt; - &gt; uint8int&lt; - &gt; uint16long &LT; - &GT; uint32

或者只使用int表示所有32位以下的无符号类型和long 32位:

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

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

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

答案 1 :(得分:1)

这是java的一个不幸的限制。这就是我要做的。

  1. 不要担心大小,使用char或int
  2. 使用位掩码为byte编写您自己的附加包装器以检查符号。这将很慢,所以我会选择#1。另一种方法是在操作期间转换为不同的数据类型。例如在将截断版本序列化为字节数据类型之前使用int。
  3. 请参阅Is there a Java library for unsigned number type wrappers?

答案 2 :(得分:1)

不要创建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]);
        }
    }

答案 3 :(得分:0)

编译器将为您进行转换:

int value = 115;
byte transformed = (byte) value;
// value == transformed => true

警告:如果将int转换为字节,则可能会丢失3 * 8位信息:

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

答案 4 :(得分:0)

java中没有未签名的数据类型,因此你必须使用其中的一种

int,char,short,byte.

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