我的目标是从输入图像中提取每个像素,根据其值对每个像素进行排序,然后根据已排序的像素值数组输出原始图像的重组版本。我相当肯定,我需要使用十六进制()函数来格式化颜色数据,以便处理过程可以再次解释它,但是我没有得到想要的结果。实际上,当我运行我的草图时,我只会得到一个全黑色的像素数组。
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;
}
}发布于 2014-01-20 12:05:42
我觉得你把事情搞得太复杂了.你可以这样做(这是整个草图):
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[]数组进行排序,那么实际上得到的是一个按如下方式排序的数组:
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最后的效果(大部分是黑色+青色的图像):

发布于 2014-01-20 13:20:31
你的素描缺少一个noStroke()。您需要在绘制边1的矩形的for循环之前添加它,否则矩形的边框(黑色)将填充整个草图。
或者,替代
fill(c);
rect(x, y, 1, 1);使用
stroke(c);
rect(x, y, 1, 1);您也可以使用point而不是rect,但是需要添加一个noSmooth()
noSmooth();
stroke(c);
point(x, y);只是为了好玩,这里有一张蒙德里安的图片,与你的脚本排序
未分类的:

排序:

如果您正在寻找颜色排序的其他方法,则可以编写自己的方法或使用可用的库(如http://toxiclibs.org/ )。
https://stackoverflow.com/questions/21229491
复制相似问题