/* * HaoRan ImageFilter Classes v0.1 * Copyright (C) 2012 Zhenjun Dai * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation. */ package com.marshalchen.common.uimodule.ImageFilter; /** * Ť��Ч�� * @author daizhj * */ public class RadialDistortionFilter implements IImageFilter{ public static class Point { public float X; public float Y; public Point(float x, float y){ X = x; Y = y; } } public float Radius = 0.5f; public float Distortion = 1.5f; public Point Center = new Point(0.5f, 0.5f); //@Override public Image process(Image imageIn) { int r, g, b; int width = imageIn.getWidth(); int height = imageIn.getHeight(); int realxpos = (int)(width * Center.X); int realypos = (int)(height * Center.Y); float realradius = Math.min(width, height) * Radius; Image clone = imageIn.clone(); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { float pos = 1f - ((float)Math.sqrt((double)(((x - realxpos) * (x - realxpos)) + (y - realypos) * (y - realypos))) / realradius); if (pos > 0f) { pos = 1f - (Distortion * pos * pos); float pos1 = (x - realxpos) * pos + realxpos; float pos2 = (y - realypos) * pos + realypos; int x1 = (int)pos1; float pos3 = pos1 - x1; int x2 = (pos3 > 0f) ? (x1 + 1) : x1; int y1 = (int)pos2; float pos4 = pos2 - y1; int y2 = (pos4 > 0f) ? (y1 + 1) : y1; if (x1 < 0){ x1 = 0; } else if (x1 >= width){ x1 = width - 1; } if (x2 < 0){ x2 = 0; } else if (x2 >= width){ x2 = width - 1; } if (y1 < 0){ y1 = 0; } else if (y1 >= height){ y1 = height - 1; } if (y2 < 0){ y2 = 0; } else if (y2 >= height){ y2 = height - 1; } r = clone.getRComponent(x1, y1); g = clone.getGComponent(x1, y1); b = clone.getBComponent(x1, y1); int r2 = clone.getRComponent(x2, y1); int g2 = clone.getGComponent(x2, y1); int b2 = clone.getBComponent(x2, y1); int r3 = clone.getRComponent(x2, y2); int g3 = clone.getGComponent(x2, y2); int b3 = clone.getBComponent(x2, y2); int r4 = clone.getRComponent(x1, y2); int g4 = clone.getGComponent(x1, y2); int b4 = clone.getBComponent(x1, y2); r = (int)((r * (1f - pos4) * (1f - pos3) + r2 * (1f - pos4) * pos3 + r3 * pos4 * pos3) + r4 * pos4 * (1f - pos3)); g = (int)((g * (1f - pos4) * (1f - pos3) + g2 * (1f - pos4) * pos3 + g3 * pos4 * pos3) + g4 * pos4 * (1f - pos3)); b = (int)((b * (1f - pos4) * (1f - pos3) + b2 * (1f - pos4) * pos3 + b3 * pos4 * pos3) + b4 * pos4 * (1f - pos3)); } else { r = clone.getRComponent(x, y); g = clone.getGComponent(x, y); b = clone.getBComponent(x, y); } imageIn.setPixelColor(x,y,r,g,b); } } return imageIn; } }