Marre des PNG

Vous en avez marre des PNG car leurs poids sont trop excessif, j’ai la solution.

Pour cela vous devez faire du alpha Masking, l’idée c’est d’avoir deux jpg, la sortie de votre image et une autre qui permet de savoir en fonction du niveau de gris la transparence qui doit lui être affecté.

Au final avec deux images vous allez en créer une seule via du code, le poids de votre apk est sera ravis.

landing_mask

Et pour le code c’est tout simple:

public static Bitmap compositeDrawableWithMask(
            Bitmap rgbBitmap, Bitmap alphaBitmap) {

        int width = rgbBitmap.getWidth();
        int height = rgbBitmap.getHeight();
        if (width != alphaBitmap.getWidth() || height != alphaBitmap.getHeight()) {
            throw new IllegalStateException("image size mismatch!");
        }

        Bitmap destBitmap = Bitmap.createBitmap(width, height,
                Bitmap.Config.ARGB_8888);

        int[] pixels = new int[width];
        int[] alpha = new int[width];
        for (int y = 0; y < height; y++) {
            rgbBitmap.getPixels(pixels, 0, width, 0, y, width, 1);
            alphaBitmap.getPixels(alpha, 0, width, 0, y, width, 1);

            for (int x = 0; x < width; x++) {
                // Replace the alpha channel with the r value from the bitmap.
                pixels[x] = (pixels[x] & 0x00FFFFFF) | ((alpha[x] << 8) & 0xFF000000);
            }
            destBitmap.setPixels(pixels, 0, width, 0, y, width, 1);
        }
        rgbBitmap.recycle();
        alphaBitmap.recycle();
        return destBitmap;
    }

Et pour ceux qui utilise mon extension de Rajawali vous la trouverez dans Utils.java.

Pour rappel, la mémoire en ram n’est pas du à la taille de vos images mais au nombres de pixel et à la profondeur des couleurs.

 

source

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *