We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Hi there, when I save PGraphics to jpg file, the background color is always Black. I've tried ####.background(255) like this to change the background color. But I'm using my canvas with live Video. So the outcome was not what I want. How can I change the background Color when I save PGraphics? Is there any way to change it?
Here is my Code.
import processing.video.*;
Capture video;
color trackColor = color(145,43,54);
color trackColor2 = color(142,156,42);
color trackColor3 = color(18,35,40);
float threshold = 25;
PGraphics topLayer;
float r2;
float g2;
float b2;
float r3;
float g3;
float b3;
float r4;
float g4;
float b4;
float distSq(float x1, float y1, float z1, float x2, float y2, float z2) {
float d = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) +(z2-z1)*(z2-z1);
return d;
}
float distSq2(float x1, float y1, float z1, float x2, float y2, float z2) {
float d2 = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) +(z2-z1)*(z2-z1);
return d2;
}
float distSq3(float x1, float y1, float z1, float x2, float y2, float z2) {
float d3 = (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) +(z2-z1)*(z2-z1);
return d3;
}
void setup() {
size(640, 360);
String[] cameras = Capture.list();
printArray(cameras);
video = new Capture(this, cameras[3]);
video.start();
trackColor = color(145,43,54);
trackColor2 = color(142,156,42);
trackColor3 = color(18,35,40);
topLayer = createGraphics(width, height, g.getClass().getName());
}
void captureEvent(Capture video) {
video.read();
}
void draw() {
video.loadPixels();
image(video, 0, 0);
//threshold = map(mouseX, 0, width, 0, 100);
threshold = 25;
float thresholdSquare = threshold * threshold;
// Begin loop to walk through every pixel
topLayer.beginDraw();
topLayer.clear();
for (int x = 0; x < video.width; x++ ) {
for (int y = 0; y < video.height; y++ ) {
int loc = x + y * video.width;
// What is current color
color currentColor = video.pixels[loc];
float r1 = (currentColor>>16)&0xFF;
float g1 = (currentColor>>7) & 0xFF ;
float b1 = (currentColor) & 0xFF;
r2 = (trackColor>>16)&0xFF;
g2 = (trackColor>>7) & 0xFF;
b2 = (trackColor) & 0xFF;
r3 = (trackColor2>>16)&0xFF;
g3 = (trackColor2>>7) & 0xFF;
b3 = (trackColor2) & 0xFF;
r4 = (trackColor3>>16)&0xFF;
g4 = (trackColor3>>7) & 0xFF;
b4 = (trackColor3) & 0xFF;
//
float d = distSq(r1, g1, b1, r2, g2, b2);
float d2 = distSq2(r1, g1, b1, r3, g3, b3);
float d3 = distSq3(r1, g1, b1, r4, g4, b4);
if (d < thresholdSquare) {
topLayer.stroke(trackColor);
topLayer.fill(trackColor);
topLayer.ellipse(x, y,2,2);
}
else if( d2 < thresholdSquare){
topLayer.stroke(trackColor2);
topLayer.fill(trackColor2);
topLayer.ellipse(x,y,2,2);
}
else if(d3 < thresholdSquare){
topLayer.stroke(trackColor3);
topLayer.fill(trackColor3);
topLayer.ellipse(x,y,2,2);
}
}
////////////////////////////////////////
}
topLayer.endDraw();
image(topLayer, 0, 0);
if(mousePressed){
topLayer.save("example.jpg");
}
}
Answers
Don't do topLayer.clear or topLayer.background. Instead, move line 50 to 69. This will ensure the transparency is not change (Better way to do it.... probly. This change is just a test)
Don't do this:
Instead, move that call to
void mousePressed(){ topLayer.save("example.jpg"); }
The former is called many times in draw while a key is pressed. The latter is called once.
Kf