Estoy tratando de implementar una aplicación que utiliza el filtro de distorsión shpere. Estoy usando un algoritmo de here que cambia la ubicación de los píxeles mediante los métodos getPixel() y setpixel(). Mi problema es que es demasiado lento para dispositivos Android y hay aplicaciones que implementan la misma esfera (y otras) filtran mucho más rápido que mi enfoque. (por ejemplo, la aplicación Picsay Pro) ¿Alguien podría compartir o dar instrucciones para encontrar o implementar algoritmos de distorsión rápida?Buscando algoritmos rápidos de distorsión de imagen
filtro real que implementa el algoritmo:
public boolean sphereFilter(Bitmap b, boolean bSmoothing)
{
int nWidth = b.getWidth();
int nHeight = b.getHeight();
Point [][] pt = new Point[nWidth][nHeight];
Point mid = new Point();
mid.x = nWidth/2;
mid.y = nHeight/2;
double theta, radius;
double newX, newY;
for (int x = 0; x < nWidth; ++x)
for (int y = 0; y < nHeight; ++y)
{
pt[x][y]= new Point();
}
for (int x = 0; x < nWidth; ++x)
for (int y = 0; y < nHeight; ++y)
{
int trueX = x - mid.x;
int trueY = y - mid.y;
theta = Math.atan2((trueY),(trueX));
radius = Math.sqrt(trueX*trueX + trueY*trueY);
double newRadius = radius * radius/(Math.max(mid.x, mid.y));
newX = mid.x + (newRadius * Math.cos(theta));
if (newX > 0 && newX < nWidth)
{
pt[x][y].x = (int) newX;
}
else
{
pt[x][y].x = 0;
pt[x][y].y = 0;
}
newY = mid.y + (newRadius * Math.sin(theta));
if (newY > 0 && newY < nHeight && newX > 0 && newX < nWidth)
{
pt[x][ y].y = (int) newY;
}
else
{
pt[x][y].x = pt[x][y].y = 0;
}
}
offsetFilterAbs(b, pt);
return true;
}
El código que sustituye a las posiciones de los pixeles calculados.
public boolean offsetFilterAbs(Bitmap b, Point[][] offset)
{
int nWidth = b.getWidth();
int nHeight = b.getHeight();
int xOffset, yOffset;
for(int y=0;y < nHeight;++y)
{
for(int x=0; x < nWidth; ++x)
{
xOffset = offset[x][y].x;
yOffset = offset[x][y].y;
if (yOffset >= 0 && yOffset < nHeight && xOffset >= 0 && xOffset < nWidth)
{
b.setPixel(x, y, b.getPixel(xOffset, yOffset));
}
}
}
return true;
}
posible duplicado de [Image Warping - Algoritmo de efecto de bulto] (http://stackoverflow.com/questions/5055625/image-warping-bulge-effect-algorithm) –
Sí, es casi un duplicado, pero tenga en cuenta que la la respuesta aceptada a esa pregunta es * no * realmente la que quiere aquí; lo que quiere es el sombreador GLSL. –
@BlueRaja, actualmente estoy usando el mismo algoritmo que el de su enlace y todavía es demasiado lento para dispositivos Android – Tony