/*
* Created on Sep 14, 2005
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package com.hphoto.util;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* @author Administrator
*
*
*/
public class FishEyeGimpyImp implements GimpyEngine {
private Properties props = null;
private int imgH;
private int imgW;
public BufferedImage getDistortedImage(BufferedImage image) {
Graphics2D graph = (Graphics2D) image.getGraphics();
imgH = image.getHeight();
imgW = image.getWidth();
//want lines put them in a variable so we migh configure these later
int hstripes = imgH/7;//4;
int vstripes = imgW/7;//8;
// claculate space between lines
int hspace = imgH / (hstripes + 1);
int vspace = imgW / (vstripes + 1);
//draw the horizontal stripes
for (int i = hspace; i < imgH; i = i + hspace) {
graph.setColor(Color.blue);
graph.drawLine(0, i, imgW, i);
}
// draw the vertical stripes
for (int i = vspace; i < imgW; i = i + vspace) {
graph.setColor(Color.red);
graph.drawLine(i, 0, i, imgH);
}
// create a pixel array of the original image.
// we need this later to do the operations on..
int pix[] = new int[imgH * imgW];
int j = 0;
for (int j1 = 0; j1 < imgW; j1++) {
for (int k1 = 0; k1 < imgH; k1++) {
pix[j] = image.getRGB(j1, k1);
j++;
}
}
double distance = ranInt(imgW / 4, imgW / 3);
// put the distortion in the (dead) middle
int wMid = image.getWidth() / 2;
int hMid = image.getHeight() / 2;
//again iterate over all pixels..
for (int x = 0; x < image.getWidth(); x++) {
for (int y = 0; y < image.getHeight(); y++) {
int relX = x - wMid;
int relY = y - hMid;
double d1 = Math.sqrt(relX * relX + relY * relY);
if (d1 < distance) {
int j2 =wMid + (int) (((fishEyeFormula(d1 / distance) * distance) / d1)* (double) (x - wMid));
int k2 =hMid + (int) (((fishEyeFormula(d1 / distance) * distance) / d1)* (double) (y - hMid));
image.setRGB(x, y, pix[j2 * imgH + k2]);
}
}
}
return image;
}
/* (non-Javadoc)
* @see nl.captcha.obscurity.GimpyEngine#setProperties(java.util.Properties)
*/
public void setProperties(Properties props) {
this.props = props;
}
private int ranInt(int i, int j) {
double d = Math.random();
return (int) ((double) i + (double) ((j - i) + 1) * d);
}
private double fishEyeFormula(double s) {
// implementation of:
// g(s) = - (3/4)s3 + (3/2)s2 + (1/4)s, with s from 0 to 1.
if (s < 0.0D) return 0.0D;
if (s > 1.0D) return s;
else
return -0.75D * s * s * s + 1.5D * s * s + 0.25D * s;
}
public static void main(String[] args) {
FishEyeGimpyImp imp = new FishEyeGimpyImp();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage image = new BufferedImage(3000, 2000, BufferedImage.TYPE_INT_ARGB);
image.getGraphics().setColor(Color.white);
image.getGraphics().drawImage(image, 0, 0, null);
image = imp.getDistortedImage(image);
try {
FileOutputStream out = new FileOutputStream(new File("./test"+System.currentTimeMillis()+".jpg"));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1f,true);
encoder.encode(image,param);
} catch (Exception e) {
// TODO: handle exception
}
}
}