【问题标题】:how to convert int to uint8 in java如何在java中将int转换为uint8
【发布时间】:2013-01-18 08:43:21
【问题描述】:

我在 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

Java:

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中的8位int是字节
  • 你当前的java实现不起作用?
  • @thang 但已签名。所以可能会引起麻烦。
  • 很遗憾,java中total的值与matlab不同。
  • @thang 不!不!不!不! Java 中的 8 位 int 已签名!

标签: java matlab int type-conversion


【解决方案1】:

在 Java 中使用较长的类型,例如,shortuint8intuint16longuint32

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

操作的时候,最后做&amp;op:

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

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

【讨论】:

【解决方案2】:

不要创建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】:

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

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

    【讨论】:

    【解决方案4】:

    编译器将为您进行转换:

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

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

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

    【讨论】:

      【解决方案5】:

      java中没有无符号数据类型,所以你必须选择其中一种

      int,char,short,byte.
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多