Processing 返回值介于0和255之间,表示指定位置的图像阴影

Processing 返回值介于0和255之间,表示指定位置的图像阴影,processing,Processing,我有一个单色(黑白)图像,我试图提取一个介于0和255之间的值,表示像素的阴影,0表示黑色,255表示白色。我按如下方式导入图像: PImage img; void setup() { size(1000, 1000); img = loadImage("myimage.jpg"); x_location = 50; y_location = 230; // add code to extract shade from img here } 我正在尝试

我有一个单色(黑白)图像,我试图提取一个介于0和255之间的值,表示像素的阴影,0表示黑色,255表示白色。我按如下方式导入图像:

PImage img;

void setup() {
  size(1000, 1000);
  img = loadImage("myimage.jpg");
  x_location = 50;
  y_location = 230;
  // add code to extract shade from img here
}

我正在尝试使用
get()
提取阴影。不幸的是,当我尝试使用
img.get(x\u位置,y\u位置)
时,它返回一个非常大的负数(大约为-1000000)。有没有办法确保
get()
返回一些规范化(可理解)的值?

这很有趣。以下是一些帮助您获得所需内容的基本代码:

PImage img;
color currentColor;

void setup() {
  size(656, 354);
  currentColor = color(0);
  img = loadImage("bean.jpeg");
}

void draw() {
  background(0);
  image(img, 0, 0);
  
  fill(currentColor);
  stroke(200);
  strokeWeight(2);
  ellipse(30, 30, 40, 40);
  fill(0);
  text("A  " + alpha(currentColor), 10, 65);
  text("R  " + red(currentColor), 10, 75);
  text("G  " + green(currentColor), 10, 85);
  text("B  " + blue(currentColor), 10, 95);
}

void mouseClicked() {
  currentColor = img.get(mouseX, mouseY);
}
看起来是这样的:

这里的神奇之处在于,您可以提取颜色中的ARGB信息。然而,我也想知道为什么它是一个负数。(我的重点):

在处理过程中,颜色实际上存储在简单的Java Int中,32位 价值观颜色伪类型实际上被处理替换为 编译前生成Java代码时使用int

此类型的宽度为32位,这是完美的,因为我们可以将其设置为4位 每个通道内部有8位。8位允许从 0到255(包括在内)。4个通道分别为alpha(不透明度)、红色、绿色、, 蓝色,通常缩写为ARGB

颜色通道的低值表示“低强度”,即黑暗。高价值 表示“高强度”,即亮度。所以如果所有通道都是0,我们就有 黑色如果他们都是255,我们有白色的。阿尔法通道是 不同:0表示低不透明度,完全透明,而255表示 高不透明度,正常不透明颜色

在Java中,数字总是有符号的。在计算中,负数是 通过将最高位设置为1来标记所以,不透明的颜色,最 公共种类,如果未提供不透明度,则默认为0xFF=255 高位设置为1,颜色值为负值。因此答案为 第一个问题

奇怪的值是将 通道。< /强>让我们采取一个简单的黄色颜色。Alpha为255(不透明), 红色是250,绿色是230,蓝色是20。这些值是0xFF, 0xFA、0xE6和0x14。结合起来生成一个int,它给出0xFFFAE614,即。 -因此是一个奇怪的数字,不容易破译


如果你的图像真的是灰度的,你可以使用RGB信息的任何部分。玩得开心

这里有一些代码来了解如何处理颜色参数。我希望这能帮助你

void setup() {
  colorMode(RGB,255,255,255,255);
  println("colorMode",g.colorModeX,g.colorModeY,g.colorModeZ,g.colorModeA);
  background(random(g.colorModeX),random(g.colorModeY),random(g.colorModeZ),random(g.colorModeA));
  int color_arg = get((int)random(width),(int)random(height));
  println("color_arg: ",color_arg);
  println("color_arg rgb_a:",red(color_arg),green(color_arg),blue(color_arg),alpha(color_arg));
  println("color_arg hsb_a:",hue(color_arg),saturation(color_arg),brightness(color_arg),alpha(color_arg));
}

我猜你在用(你没说)。文档中说“返回的数字是根据当前的颜色范围进行缩放的”。这可能是问题所在吗?是的,我想是皮梅奇3号。我想这可能就是问题所在;问题是我不知道当前的颜色范围是什么,也不知道如何检索它们。了解这些信息会很有用,因为这样我就可以自己规范化输出了。有什么想法吗?