/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.sources.effects;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import javax.swing.JPanel;
import webcamstudio.sources.effects.controls.NoBackgroundControl;
/**
*
* @author pballeux (modified by karl)
*/
public class NoBackground extends Effect {
private BufferedImage background = null;
private BufferedImage lastImage = null;
private int rThreshold = 0;
private int gThreshold = 0;
private int bThreshold = 0;
// @Override
public void applyEffectTest(BufferedImage img) {
lastImage = deepCopy(img);
if (background != null) {
int[] data = ((java.awt.image.DataBufferInt) img.getRaster().getDataBuffer()).getData();
int[] dataBG = ((java.awt.image.DataBufferInt) background.getRaster().getDataBuffer()).getData();
int r, g, b, c, cb;
for (int i = 0; i < data.length; i++) {
c = data[i];
cb = dataBG[i];
r = ((((c & 0x00FF0000) >> 16))) - (((cb & 0x00FF0000) >> 16));
g = (((c & 0x0000FF00) >> 8)) - (((cb & 0x0000FF00) >> 8));
b = (((c & 0x000000FF))) - ((cb & 0x000000FF));
if (r < 0) {
r *= -1;
}
if (g < 0) {
g *= -1;
}
if (b < 0) {
b *= -1;
}
int rRatio = Math.abs(r) * 100 / 255;
int gRatio = Math.abs(g) * 100 / 255;
int bRatio = Math.abs(b) * 100 / 255;
if (rRatio < rThreshold && bRatio < bThreshold && gRatio < gThreshold) {
data[i] = c & 0x00FFFFFF;
}
}
}
}
@Override
public void applyEffect(BufferedImage img) {
lastImage = deepCopy(img);
if (background != null) {
int[] data = ((java.awt.image.DataBufferInt) img.getRaster().getDataBuffer()).getData();
int[] dataBG = ((java.awt.image.DataBufferInt) background.getRaster().getDataBuffer()).getData();
int r, g, b, c, cb;
int r1, g1, b1;
for (int i = 0; i < data.length; i++) {
c = data[i];
cb = dataBG[i];
r = (c >> 16) & 0xff;
g = (c >> 8) & 0xff;
b = c & 0xff;
r1 = (cb >> 16) & 0xff;
g1 = (cb >> 8) & 0xff;
b1 = cb & 0xff;
int rRatio = Math.abs(r1 - r) * 100 / 255;
int gRatio = Math.abs(g1 - g) * 100 / 255;
int bRatio = Math.abs(b1 - b) * 100 / 255;
if (rThreshold > rRatio && gThreshold > gRatio && bThreshold > bRatio) {
data[i] &= 0x00FFFFFF;
}
}
}
}
BufferedImage deepCopy(BufferedImage bi) {
ColorModel cm = bi.getColorModel();
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
WritableRaster raster = bi.copyData(null);
BufferedImage temp = new BufferedImage(cm, raster, isAlphaPremultiplied, null);
return temp;
}
public void setRThreshold(int t) {
rThreshold = t/2;
}
public void setGThreshold(int t) {
gThreshold = t/2;
}
public void setBThreshold(int t) {
bThreshold = t/2;
}
public int getRThreshold() {
return rThreshold*2;
}
public int getGThreshold() {
return gThreshold*2;
}
public int getBThreshold() {
return bThreshold*2;
}
public BufferedImage getLastImage() {
return lastImage;
}
@Override
public boolean needApply(){
return needApply=true;
}
@Override
public JPanel getControl() {
return new NoBackgroundControl(this);
}
public void setBackgroundImage(BufferedImage img) {
if (img != null) {
background = img;
}
}
@Override
public void resetFX() {
// nothing here.
}
}