Como recortar una imagen en Blackberry

Tuve que crear una función para poder “recortar” o “cropear” una imagen en una aplicación blackberry. Para ello hice empleo de los métodos Bitmap.getARGB() y Bitmap.setARGB():

    public static EncodedImage cropImage(EncodedImage image, int width, int height) {
        EncodedImage result = null;
        Bitmap bmp = new Bitmap(width, height);

        Bitmap original = image.getBitmap();

        int x = (original.getWidth() / 2) - (width / 2); // Centre el ancho de la img a recortar
        int y = (original.getHeight() / 2) - (height / 2); // Centre el alto de la img a recortar
        int[] argb = new int[width * height]; 
        original.getARGB(argb, 0, width, x, y, width, height);
        bmp.setARGB(argb, 0, width, 0, 0, width, height);
        result = JPEGEncodedImage.encode(bmp, 100);
        return result;
    }

En este caso en particular, se recorta al centro de la imagen el tamaño deseado. Considerando el código, seria bueno poner algunos controles sobre el tamaño de la imagen a recortar para que no ingresen dimensiones mayores de la imagen origninal. Tambien seria bueno checkear que el contenido sea valido y atrapar excepciones.

[RIM] Redondeo de float y double en 4.5

La clase MathUtilites disponible en el framework the Blackberry 4.5 no tiene disponible el método round() que permitiria redondear un número flotante o double. A diferencia de floor() o ceil(), round toma un valor decimal y si es mayor o igual a  .5 lo redondea al siguiente entero, en caso contrario al entero anterior. Esta “deficiencia” se discutió en los foros oficiales de blackberry: http://supportforums.blackberry.com/t5/Java-Development/Math-round-and-Math-random/m-p/206288Y una de las respuestas en muy interesante y que fue marcada como la solucion a esto. Es simplemente sumar a la variable float o double 0.5, asi:

public static int round(float f)
{
    return (int)(f + 0.5F);
}
public static long round(double d)
{
    return (long)(d + 0.5D);
}

Como verán, éste corrimiento hace que cualquier valor cuyo valor decimal sea inferior a 0.5 se mantenga en el mismo entero. Por ejemplo 3.2 se convertiria en 3.7 y al hacer casting a long o int, el valor devuelto seria 3. Pero cuando el valor decimal es superior o igual a 0.5 todo el valor se mueve al siguiente entero. Por ejemplo 3.7 seria 4.2 por lo tanto el valor “redondeado” seria 4. Esta solución me parecio interesante por su simpleza, aunque uno podria hacer su propia version con “if-else” para hacer el mismo comportamiento.