Caspert
Caspert

Reputation: 4363

How to create a mask from Polygons (processing)?

I am trying to create from a custom shape a mask for an image. In processing I came up with this:

Image img;
PImage img2;
PGraphics mGraphic;

void setup(){
 img = loadImage("mask.jpg");
 img2 = loadImage("test.jpg");
 mGraphic = createGraphics(1024,1024, JAVA2D);
 size(img.width, img.height);
}

void draw(){
  background(255);

  mGraphic.beginDraw();
  mGraphic.background(0); 
  mGraphic.ellipse(mouseX, mouseY, 400, 400); 
  mGraphic.endDraw();

  img2.mask(mGraphic);
  image(img2,0,0);

}

Above code will create a ellipse that will be the mask of the image. I would like to achieve the same with a custom shape generated by Polygons:

import java.awt.Polygon;

PImage img;
PImage img2;
PGraphics mGraphic;

CustomShape myShape = new CustomShape();

void setup(){
 img = loadImage("mask.jpg");
 img2 = loadImage("test.jpg");
 mGraphic = createGraphics(1024,1024, JAVA2D);

  myShape.addPoint(25, 25);
  myShape.addPoint(275, 25);
  myShape.addPoint(275, 75);
  myShape.addPoint(175, 75);
  myShape.addPoint(175, 275);
  myShape.addPoint(125, 275);
  myShape.addPoint(125, 75);
  myShape.addPoint(25, 75);
  smooth();

// img2.filter(INVERT);
 size(img.width, img.height);
}

void draw(){

  background(255);
  stroke(0);
  myShape.display();

  img2.mask(myShape);
  image(img2,0,0);

}


class CustomShape extends Polygon {

  void display() {
    stroke(0);
    fill(0);
    beginShape();
    for (int i=0; i<npoints; i++) {
      vertex(xpoints[i], ypoints[i]); 
    }
    endShape(CLOSE);
  }
}

Unfortunately, this code will give me an error: The method mask(int[]) in the type PImage is not applicable for the arguments (Masking_image_1.CustomShape)

Is this even possible to get the same result as my first code, but then with the use of a custom shape? And how can I solve that?

If there are any questions left, please let me know. Above code will work inside Processing.

Upvotes: 1

Views: 1570

Answers (1)

Kevin Workman
Kevin Workman

Reputation: 42176

Well, your error says it all: the mask() function does not know what to do with a CustomShape parameter. The parameter needs to be a PImage or a mask array. More info can be found in the reference.

To use your custom shape, what you want to do is draw that custom shape to a PGraphics (which is a subclass of PImage), and then use that PGraphics as the mask. You'd do that using the createGraphics() function. Again, more info can be found in the reference.

Upvotes: 1

Related Questions