/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.sources.effects; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import javax.swing.JPanel; import webcamstudio.sources.effects.controls.CartoonControl; /** * * @author pballeux (modified by karl) */ public class Cartoon extends Effect { private final com.jhlabs.image.ContourFilter counterFilter = new com.jhlabs.image.ContourFilter(); int contourSize = 1; int colorSplit = 1; int scale = 5; @Override public boolean needApply(){ return needApply=true; } @Override public void applyEffect(BufferedImage img) { counterFilter.setScale(scale / 10F); counterFilter.setLevels(contourSize / 10F); int[] data = ((java.awt.image.DataBufferInt) img.getRaster().getDataBuffer()).getData(); int r, g, b, a, c; int delta1, delta2; for (int i = 0; i < data.length; i++) { c = data[i]; r = (c & 0x00FF0000) >> 16; g = (c & 0x0000FF00) >> 8; b = c & 0x000000FF; a = (c & 0xFF000000) >> 24; delta1 = r - g; delta2 = g - b; if (colorSplit == 0) { colorSplit = 1; } //Downscaling the red value r = r / colorSplit * colorSplit; g = r - delta1; if (g < 0) { g = 0; } b = g - delta2; if (b < 0) { b = 0; } data[i] = r << 16 | g << 8 | b | a << 24; } Graphics2D buffer = img.createGraphics(); BufferedImage temp = counterFilter.filter(img, null); buffer.setBackground(new java.awt.Color(0, 0, 0, 0)); buffer.clearRect(0, 0, img.getWidth(), img.getHeight()); buffer.drawImage(temp, 0, 0, null); buffer.dispose(); } public void setContourSize(int size) { contourSize = size; } public int getContourSize() { return contourSize; } public void setSplitColor(int value) { colorSplit = value; } public int getSplitColor() { return colorSplit; } public void setScale(int value) { scale = value; } public int getScale() { return scale; } @Override public JPanel getControl() { return new CartoonControl(this); } @Override public void resetFX() { // nothing here. } }