使用迷你图像构成图像(处理)

时间:2017-07-21 20:48:08

标签: processing

在我的草图中,你有一堆迷你图像可以组成输入图片 目前我输入的是一张手的图片,我的小图片是:https://imgur.com/a/0Y5s9
(3个测试迷你图像是透明的,所以将它们拖离imgur,它们目前是黑色的)
我目前的输出如下: http://imgur.com/a/sIZuA

我不确定为什么它们会像这样重叠,我已经将每个迷你图像的背景透明化,以便它们可以重叠,所以我需要一种方法来缩小它们。

我想解决的主要问题是我需要确保我的迷你图像只是手,而不是手上的白色背景。我想如果迷你图像只分配到手的阴影中,那么白色背景就算不上了。

我不知道该怎么做。救命?

代码:

final int len=25;
final float thresh=170;

boolean newDesign=false;
PImage pic;

ArrayList<PImage> imgContainer;
int n=3;

void setup() {  
  size(800, 800, P2D);
  colorMode(RGB, 255);
  background(250, 250, 250);
  rectMode(CENTER);
  //imageMode(CENTER);

  pic=loadImage("hand.jpg");
  pic.resize(width, height);

  color c1 = color(200,25,25);
  color c2 = color(25, 255, 200);  

  imgContainer=new ArrayList<PImage>();
PImage pimg1=loadImage("test0.png");
pimg1.resize(50, 50);
imgContainer.add(pimg1);
PImage pimg2=loadImage("test1.png");
pimg2.resize(50, 50);
imgContainer.add(pimg2);
PImage pimg3=loadImage("test2.png");
pimg1.resize(50, 50);
imgContainer.add(pimg3);
  noLoop();
  noStroke();
}

void draw() {
  if (newDesign==false) {
    return;
  }

  pic.loadPixels();

  for (int y = 0; y < height; y+=18) {
    for (int x = 0; x < width; x+=18) {
      // Get the color stored in the pixel
      int index=y*width+x;
      color pixelValue = pic.pixels[index];
      // Determine the brightness of the pixel
      float pixelBrightness = brightness(pixelValue);

      float imgPicked=constrain(pixelBrightness/thresh, 0, n-1);
      image(imgContainer.get((int)imgPicked),x,y);

    }
  }
}

void mouseReleased() {
  newDesign=!newDesign;
  redraw();

    }

2 个答案:

答案 0 :(得分:0)

很难回答一般的“我该怎么做”这类问题。 Stack Overflow专为更具体的“我试过X,期望Y,但得到Z而不是”类型问题而设计。但我会尽力帮助。

您问的是如何只在较大图像的特定部分显示小图像。

在高级别,你想要做的是在你要绘制小图像的大图像中的坐标上循环,然后在每个坐标处获取像素,检查它,并且只绘制一个小图像,如果像素匹配一些标准。

您可以使用嵌套的for循环遍历坐标(您已经完成此部分),并且可以使用get()函数获取该坐标的像素颜色(您可以进行排序)这个)。然后,您可以使用if语句检查该颜色,只有在符合某些条件时才会绘制小图像。

更多信息可以在the reference找到,但有一个非常基本的例子:

for (int y = 0; y < height; y+= 100) {
  for (int x = 0; x < width; x+= 100) {

    color pixelValue = largeImage.get(x, y);

    if(red(pixelValue) > 128){
      image(smallImage, x, y);
    }
  }
}

此代码假定窗口与大图像的大小相同。然后它循环遍历大图像中的坐标(仅查看每100个像素),并获得该像素的颜色。然后检查该像素是否具有大于128的红色值,如果是,则在该坐标处绘制小图像。

这只是一个示例,因此您将不得不修改方法以满足您的需求。但基本思想仍然是:迭代像素,获取颜色,检查颜色,如果颜色符合某些标准,则只绘制较小的图像。

这也是您使用彩色字母发布的图像的工作原理,而不是绘制较小的图像,而是使用基础像素的颜色绘制字符。

答案 1 :(得分:-1)

我认为此网站上的代码为您的问题提供了解决方案。

https://lernprocessing.wordpress.com/2010/01/16/projekt-bild-aus-text/

这是一个德国网站(部分代码注释也是德语),所以请随时询问您是否有任何问题。