/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.sources.effects;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.JPanel;
import org.imgscalr.Scalr;
/**
*
* @author karl
*/
public class MotionAlpha extends Effect {
private ArrayList<BufferedImage> previusImagesIn = new ArrayList<>();
private int imageCount = 0;
BufferedImage previusImageIn;
boolean motion = false;
int keepMotion = 0;
@Override
public void applyEffect(BufferedImage img) {
BufferedImage currImg = img;
currImg = Scalr.resize(currImg, Scalr.Mode.AUTOMATIC, 320, 240);
previusImagesIn.add(currImg);
if (imageCount > 1){
previusImageIn = previusImagesIn.get(1);
previusImagesIn.remove(0);
} else {
previusImageIn = currImg;
}
Graphics2D buffer = img.createGraphics();
buffer.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
buffer.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_SPEED);
buffer.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF);
buffer.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
buffer.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
buffer.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_SPEED);
buffer.setRenderingHint(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_DISABLE);
// System.out.println("NumPixelChanged: "+bufferedImagesEqual(currImg, previusImageIn));
if (bufferedImagesEqual(currImg, previusImageIn) > 10) {
motion = true;
keepMotion = imageCount + 50;
} else if (keepMotion <= imageCount) {
motion = false;
}
if (motion) {
buffer.drawImage(img, 0, 0, null);
buffer.dispose();
// System.out.println("Motion");
imageCount ++ ;
} else {
buffer.setBackground(new Color(0, 0, 0, 0));
buffer.clearRect(0, 0, img.getWidth(), img.getHeight());
buffer.dispose();
// System.out.println("No Motion");
imageCount ++ ;
}
}
private int bufferedImagesEqual(BufferedImage img1, BufferedImage img2) {
int numPixelChanged = 0;
for (int i=0; i<((BufferedImage)img1).getWidth(); i++) {
for (int j=0; j<((BufferedImage)img1).getHeight(); j++) {
int curr = ((BufferedImage)img1).getRGB(i, j);
//int currA = (curr >>> 24) & 0xFF;
int currR = (curr >>> 16) & 0xFF;
int currG = (curr >>> 8) & 0xFF;
int currB = (curr) & 0xFF;
int prev = ((BufferedImage)img2).getRGB(i, j);
//int prevA = (prev >>> 24) & 0xFF;
int prevR = (prev >>> 16) & 0xFF;
int prevG = (prev >>> 8) & 0xFF;
int prevB = (prev) & 0xFF;
int diff = Math.abs(currR-prevR)
+ Math.abs(currG-prevG)
+ Math.abs(currB-prevB);
if (diff > 300)
numPixelChanged ++;
}
}
if (numPixelChanged > 10000) {
return 0;
} else {
return numPixelChanged;
}
}
@Override
public boolean needApply(){
return needApply=true;
}
@Override
public JPanel getControl() {
JPanel dummy = new JPanel();
return dummy;
}
@Override
public void resetFX() {
// nothing here.
}
}