gpt4 book ai didi

java - "int pix = (0xff & ((int) first[ij])); "是什么意思?

转载 作者:行者123 更新时间:2023-11-29 05:31:48 25 4
gpt4 key购买 nike

以下代码是工作中的相机应用程序的一部分,该应用程序检测运动并保存预览,将运动部件涂成红色。

public class RgbMotionDetection implements IMotionDetection {
that detects motion
private static final int mPixelThreshold = 50; // Difference in pixel (RGB)
private static final int mThreshold = 10000; // Number of different pixels


private static int[] mPrevious = null;
private static int mPreviousWidth = 0;
private static int mPreviousHeight = 0;

/**
* {@inheritDoc}
*/
@Override
public int[] getPrevious() {
return ((mPrevious != null) ? mPrevious.clone() : null);
}

protected static boolean isDifferent(int[] first, int width, int height) {
if (first == null) throw new NullPointerException();

if (mPrevious == null) return false;
if (first.length != mPrevious.length) return true;
if (mPreviousWidth != width || mPreviousHeight != height) return true;

int totDifferentPixels = 0;
for (int i = 0, ij = 0; i < height; i++) {
for (int j = 0; j < width; j++, ij++) {
int pix = (0xff & ((int) first[ij]));
int otherPix = (0xff & ((int) mPrevious[ij]));

// Catch any pixels that are out of range
if (pix < 0) pix = 0;
if (pix > 255) pix = 255;
if (otherPix < 0) otherPix = 0;
if (otherPix > 255) otherPix = 255;

if (Math.abs(pix - otherPix) >= mPixelThreshold) {
totDifferentPixels++;
// Paint different pixel red
first[ij] = Color.RED;
}
}
}

我想充分理解这一点以便能够修改。

真正让我困惑的是:

 int pix = (0xff & ((int) first[ij]));

它有什么作用?

谢谢

戴夫

最佳答案

如果我现在解释一些你知道的事情,请原谅我,但我想让它成为一个独立的答案。

像素的颜色可以存储在一个整数中。 Java 中的整数由四个字节组成,颜色通常(在此上下文中)用四个字节表示:红色、绿色和蓝色各一个字节,最后一个字节用于透明度。屏幕上子像素的混合导致观察到的颜色。

所以下面的整数代表一种颜色:

0    0    f    f    c    c    a    a      (Hexadecimal representation)
0000 0000 1111 1111 1100 1100 1010 1010 (Binary representation)
Transp.-- Red------ Green---- Blue----- (Color interpretation)
16764074 (Decimal representation, quite useless here)

在这种情况下,前两个字节 (00) 表示透明度,ff 表示红色子像素,cc 表示绿色,aa 表示蓝色。

如果我们只想得到其中的一部分,例如蓝色子像素,我们需要一个位掩码。

0000 0000 1111 1111 1100 1100 1010 1010   (Binary representation)
& (Binary AND: Return 1 if both bits are 1)
0000 0000 0000 0000 0000 0000 1111 1111 (Bitmask for blue, in hex 0x000000ff)
=
0000 0000 0000 0000 0000 0000 1010 1010

这是你提到的行中的操作结果,它只是使用掩码的简写十六进制解释:

int pix = (0xff & ((int) first[ij]));

由于数组 first 已经是一个 int 数组,因此 first[ij] 的转换是无用的。

如果你想要像素的另一部分,比如绿色部分,你需要移动掩码(或使用硬编码值)并且需要将结果移回:

00ffccaa
&
0000ff00 Hardcoded, alternative: ff << 8
=
0000cc00

将结果移动到整数内最右边的位置

0000cc00 >> 8 = 000000cc

类似于 16 和 24 的红色响应。透明度。

所以这条线给了你像素的蓝色子像素的值。该值在 0..255 范围内,因为这些是八位唯一可能的值(当被解释为无符号字节或存储在 Java int 中时,就像这里所做的那样;Java byte 已签名,不会使用该十进制表示,而是 -128..127);任何对其他值的检查在这里都是无用的。

关于java - "int pix = (0xff & ((int) first[ij])); "是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com