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 :
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.
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();
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); } }
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!