首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在处理过程中转换颜色数据

如何在处理过程中转换颜色数据
EN

Stack Overflow用户
提问于 2014-01-20 08:43:44
回答 2查看 940关注 0票数 1

我的目标是从输入图像中提取每个像素,根据其值对每个像素进行排序,然后根据已排序的像素值数组输出原始图像的重组版本。我相当肯定,我需要使用十六进制()函数来格式化颜色数据,以便处理过程可以再次解释它,但是我没有得到想要的结果。实际上,当我运行我的草图时,我只会得到一个全黑色的像素数组。

代码语言:javascript
复制
size(150, 150);
PImage myImage = loadImage("image.jpg");
image(myImage, 0, 0);

int[] colors = new int[22500];

loadPixels();
for (int i = 0; i < 22500; i++) {
  colors[i] = pixels[i];
}
updatePixels();

int x = 1;
int y = 1;

colors = sort(colors);

for (int i = 0; i < 22500; i++) {
  color c = colors[i];
  fill(c);
  rect(x, y, 1, 1);

  x = x + 1;

  if (x > width-3) {
    x = 1;
    y = y + 1;
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-20 12:05:42

我觉得你把事情搞得太复杂了.你可以这样做(这是整个草图):

代码语言:javascript
复制
PImage myImage = loadImage("image.jpg");
size(myImage.width*2, myImage.height);
myImage.loadPixels();
image(myImage, 0, 0);
myImage.pixels = sort(myImage.pixels);
myImage.updatePixels();
image(myImage, myImage.width, 0);

但我有种预感,结果会和你期望的不一样.如果您想要在颜色之间顺利过渡,“排序”功能将不会做,因为颜色不是那样存储的。一个快速的解释:每个像素的颜色是红色、绿色和蓝色三种颜色的组合(让我们暂时保留透明度)。所以一个橙色和典型的颜色选择器是255(R) 204(G) 0(B)。这三个值彼此相接,以存储最终颜色。如果您将它们转换为十六进制,则更容易理解: FF(R) CC(G) 00(B)。十六进制的最终值如下所示: FFCC00。如果您再次将其转换为十进制,以便存储它,您将得到16763904,这就是pixels[]数组所填充的内容。如果您正在尝试对pixels[]数组进行排序,那么实际上得到的是一个按如下方式排序的数组:

代码语言:javascript
复制
 R   G   B
000 000 000
000 000 001 // a bit blue but almost black
000 000 002 // getting bluer
.
.
.
000 000 255 // all blue
000 001 000 // a bit green but almost black
000 001 001 // a bit green and a bit blue
.
.
.
000 255 000 // all green
000 255 001 // all green and a bit blue (going to cyan)
.
.
.
000 255 255 // cyan
001 000 000 // a bit red but almost black
001 001 000 // a bit red and a bit green
.
.
.
255 000 000 // all red
.
.
.
255 255 000 // yellow
.
.
.
255 255 255 // white

最后的效果(大部分是黑色+青色的图像):

票数 3
EN

Stack Overflow用户

发布于 2014-01-20 13:20:31

你的素描缺少一个noStroke()。您需要在绘制边1的矩形的for循环之前添加它,否则矩形的边框(黑色)将填充整个草图。

或者,替代

代码语言:javascript
复制
  fill(c);
  rect(x, y, 1, 1);

使用

代码语言:javascript
复制
  stroke(c);
  rect(x, y, 1, 1);

您也可以使用point而不是rect,但是需要添加一个noSmooth()

代码语言:javascript
复制
  noSmooth();
  stroke(c);
  point(x, y);

只是为了好玩,这里有一张蒙德里安的图片,与你的脚本排序

未分类的:

排序:

如果您正在寻找颜色排序的其他方法,则可以编写自己的方法或使用可用的库(如http://toxiclibs.org/ )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21229491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档