Maison > Java > javaDidacticiel > Comment extraire efficacement des données de pixels sous forme de tableau d'entiers à partir d'une image tamponnée en Java ?

Comment extraire efficacement des données de pixels sous forme de tableau d'entiers à partir d'une image tamponnée en Java ?

Linda Hamilton
Libérer: 2025-01-05 14:18:40
original
593 Les gens l'ont consulté

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

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

BufferedImage fournit diverses méthodes pour travailler avec des données de pixels. Cependant, certaines de ces méthodes peuvent ne pas être optimales pour accéder efficacement aux informations sur les pixels. Il existe deux approches principales pour extraire les données de pixels en Java :

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

    Cette méthode récupère les couleurs des pixels sous forme d'entiers qui combinez les valeurs alpha, rouge, verte et bleue. Bien que pratique, cette approche est plus lente car elle nécessite de décoder les informations de couleur et de les réorganiser dans des canaux séparés.

  2. Accès direct au tableau de pixels :

    Pour accéder directement au tableau de pixels, vous pouvez utiliser le code suivant :

    byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
    Copier après la connexion

    Cette méthode fournit un accès brut aux couleurs rouge, vert, et les valeurs bleues pour chaque pixel. S'il existe un canal alpha, il sera également inclus dans le tableau d'octets. Bien que cette méthode nécessite des calculs d'index plus complexes, elle est nettement plus rapide que l'utilisation de getRGB().

Comparaison des performances

Les benchmarks démontrent une différence notable en temps de traitement entre les deux approches. Le passage de getRGB() à l’accès direct au tableau a entraîné une amélioration de la vitesse de plus de 90 % lors de la gestion d’images volumineuses. Voici un exemple de code pour comparer les performances :

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.IOException;

public class PerformanceComparison {

    public static void main(String[] args) throws IOException {
        BufferedImage image = ImageIO.read(PerformanceComparison.class.getResource("large_image.jpg"));

        // Using getRGB()
        long startTime = System.nanoTime();
        int[][] resultRGB = convertTo2DUsingGetRGB(image);
        long endTime = System.nanoTime();
        System.out.println("getRGB(): " + toString(endTime - startTime));

        // Using direct array access
        startTime = System.nanoTime();
        int[][] resultArray = convertTo2DWithoutUsingGetRGB(image);
        endTime = System.nanoTime();
        System.out.println("Direct Array Access: " + toString(endTime - startTime));
    }

    private static 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;
    }

    private static int[][] convertTo2DWithoutUsingGetRGB(BufferedImage image) {
        final byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
        final int width = image.getWidth();
        final int height = image.getHeight();
        int[][] result = new int[height][width];

        int index = 0;
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int alpha = pixels[index++] & 0xFF;
                int blue = pixels[index++] & 0xFF;
                int green = pixels[index++] & 0xFF;
                int red = pixels[index++] & 0xFF;
                result[y][x] = (alpha << 24) | (blue << 16) | (green << 8) | red;
            }
        }

        return result;
    }

    private static String toString(long nanos) {
        return String.format("%d min %d s %d ms", nanos / 60000000000L, (nanos % 60000000000L) / 1000000000L, (nanos % 1000000000L) / 1000000L);
    }
}
Copier après la connexion

N'oubliez pas que la meilleure approche pour extraire les données de pixels dépend de vos besoins spécifiques ainsi que de la taille et de la complexité des images avec lesquelles vous travaillez.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal