Maison >Java >javaDidacticiel >Comment extraire efficacement les données de pixels d'une image sous forme de tableau d'entiers en Java ?

Comment extraire efficacement les données de pixels d'une image sous forme de tableau d'entiers en Java ?

DDD
DDDoriginal
2024-12-19 18:17:08995parcourir

How to Efficiently Extract Pixel Data from an Image as an Integer Array in Java?

Comment extraire des données de pixels d'une image sous forme de tableau d'entiers en Java

Lorsque vous travaillez avec des images en Java, il peut arriver que vous devez accéder aux données de pixels de manière efficace. Ces données peuvent être utiles pour diverses tâches de traitement d'images, telles que la manipulation des pixels, l'analyse des couleurs et la visualisation des données.

1. Utilisation de la méthode getRGB() :

La classe BufferedImage en Java fournit une méthode pratique appelée getRGB(). Cette méthode renvoie un entier représentant la couleur d'un pixel spécifique de l'image. En parcourant toute l'image, vous pouvez extraire toutes les valeurs de pixels et les organiser dans un tableau d'entiers 2D. Cependant, cette approche peut être coûteuse en termes de calcul pour les grandes images.

2. Accès direct au tableau de pixels :

Une approche alternative consiste à accéder directement au tableau de pixels sous-jacent dans BufferedImage. Cela peut être fait en utilisant la classe DataBufferByte. En obtenant le tableau 'byte[] pixels' du tampon de données, vous avez un accès direct aux valeurs brutes des pixels. Cette méthode offre des performances améliorées par rapport à l'utilisation de getRGB(), en particulier pour les grandes images.

Pour illustrer la différence de performances, le code fourni compare les deux approches en utilisant une image massive de 12 000 x 12 000 pixels. Les résultats démontrent clairement que l'accès direct au tableau de pixels est nettement plus rapide, réduisant le temps de traitement de plus de 90 %.

int[][] convertTo2DUsingGetRGB(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();
    int[][] result = new int[height][width];

    for (int row = 0; row < height; row++) {
        for (int col = 0; col < width; col++) {
            result[row][col] = image.getRGB(col, row);
        }
    }

    return result;
}

int[][] convertTo2DWithoutUsingGetRGB(BufferedImage image) {
    final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    final int width = image.getWidth();
    final int height = image.getHeight();
    final boolean hasAlphaChannel = image.getAlphaRaster() != null;

    int[][] result = new int[height][width];

    // Process pixels with alpha channel
    if (hasAlphaChannel) {
        for (int pixel = 0, row = 0, col = 0; pixel + 3 < pixels.length; pixel += 4) {
            int argb = 0;
            argb += (((int) pixels[pixel] & 0xff) << 24); // alpha
            argb += ((int) pixels[pixel + 1] & 0xff); // blue
            argb += (((int) pixels[pixel + 2] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 3] & 0xff) << 16); // red
            result[row][col] = argb;
            col++;
            if (col == width) {
                col = 0;
                row++;
            }
        }
    } 
    // Process pixels without alpha channel
    else {
        for (int pixel = 0, row = 0, col = 0; pixel + 2 < pixels.length; pixel += 3) {
            int argb = 0;
            argb += -16777216; // 255 alpha
            argb += ((int) pixels[pixel] & 0xff); // blue
            argb += (((int) pixels[pixel + 1] & 0xff) << 8); // green
            argb += (((int) pixels[pixel + 2] & 0xff) << 16); // red
            result[row][col] = argb;
            col++;
            if (col == width) {
                col = 0;
                row++;
            }
        }
    }

    return result;
}

En utilisant l'accès direct au tableau de pixels, vous pouvez extraire efficacement les données de pixels et adresser les pixels individuels en fonction sur leurs coordonnées x et y, vous offrant une approche polyvalente et performante pour les tâches de manipulation et d'analyse d'images.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn