Question

est-il une possibilité de J2ME pour convertir une image (chargement d'un fichier PNG avec alpha) à une nouvelle image en niveaux de gris transparent?

Jusqu'à présent, je ne suis arrivé les valeurs rgb, mais pas l'alpha.

Merci.

Edit: oui, il devrait être 32 niveaux de gris bits

.
Était-ce utile?

La solution

J'ai trouvé la solution et est le code ici:

    public Image getGrayScaleImage() {
    int[] rgbData = new int[getWidth() * getHeight()];
    image.getRGB(rgbData, 0, getWidth(), 0, 0, getWidth(), getHeight());
    for (int x = 0; x < getWidth() * getHeight(); x++) {
        rgbData[x] = getGrayScale(rgbData[x]);
    }
    Image grayImage = Image.createRGBImage(rgbData, getWidth(), getHeight(), true);
    return grayImage;
}

private int getGrayScale(int c) {
    int[] p = new int[4];
    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level
    p[3] = (int) (c & 0x000000FF); // Blue level

    int nc = p[1] / 3 + p[2] / 3 + p[3] / 3;
    // a little bit brighter
    nc = nc / 2 + 127;

    p[1] = nc;
    p[2] = nc;
    p[3] = nc;

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]);
    return gc;
}

getRGB renvoie la valeur de couleur, qui comprend également le canal alpha. Donc, je ne devais changer chaque valeur du tableau et de créer une image de cela.

J'ai trouvé un document utile dans le forum nokia: MIDP 2.0: Travailler avec des pixels et drawRGB ()

Autres conseils

Merci pour le code sur la conversion en niveaux de gris. Cependant, je remarque que, sur Nokia Series 40 appareils, ce code fonctionne assez lentement.

Il y a 2 OPTIMISATIONS. La principale est de supprimer toute création d'objet dans getGrayScale (). À l'heure actuelle, un objet de tableau est créé pour chaque pixel. Pour une moyenne, disons QVGA, affichage qui est 76800 objets de tableau créé, ce qui est beaucoup d'ordures, et appellera probablement GC. Définition de l'int [4] comme un champ dans la classe supprime cette création d'objets. Le compromis est ici une petite quantité de RAM supplémentaire utilisée pour la classe.

La seconde consiste à mettre en cache la largeur et la hauteur dans getGrayScaleImage (). Sur certains appareils, la méthode appelle à getWidth () et getHeight () sera appelé à plusieurs reprises sans Optimisations (un compilateur JIT sera OK, mais certains appareils interprétés non). Donc, encore une fois pour QVGA, la getWidth () et getHeight () sera appelé certains> 150000 entre eux.

En tout, je trouve cette version modifiée couru beaucoup plus rapide: -)

public Image getGrayScaleImage(Image screenshot) {
    int width = getWidth();
    int height = getHeight();
    int screenSizeInPixels = (width * height);

    int[] rgbData = new int[width * height];

    image.getRGB(rgbData, 0, width, 0, 0, width, height);
    for (int x = 0; x < screenSizeInPixels ; x++) {
        rgbData[x] = getGrayScale(rgbData[x]);
    }

    Image grayImage = Image.createRGBImage(rgbData, width, height, true);
    return grayImage;
}

static int[] p = new int[4];
private int getGrayScale(int c) {

    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level
    p[3] = (int) (c & 0x000000FF); // Blue level

    int nc = p[1] / 3 + p[2] / 3 + p[3] / 3;
    // a little bit brighter
    nc = nc / 2 + 127;

    p[1] = nc;
    p[2] = nc;
    p[3] = nc;

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]);
    return gc;
}

(Si vous ne voulez pas vraiment d'utiliser l'espace de données de classe, il suffit de remplacer l'int [] avec quatre variables séparées int locales qui vivent sur la pile)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top