Java で画像からピクセル データを整数配列として抽出する方法
Java で画像を操作する場合、効率的な方法でピクセル データにアクセスする必要があります。このデータは、ピクセル操作、色分析、データ視覚化などのさまざまな画像処理タスクに役立ちます。
1. getRGB() メソッドの利用:
Java の BufferedImage クラスには、getRGB() という便利なメソッドが用意されています。このメソッドは、画像内の特定のピクセルの色を表す整数を返します。画像全体を反復処理することで、すべてのピクセル値を抽出し、2D 整数配列に配置できます。ただし、このアプローチは、大きな画像では計算コストが高くなる可能性があります。
2.ピクセル配列への直接アクセス:
別のアプローチは、BufferedImage 内の基礎となるピクセル配列に直接アクセスすることです。これは、DataBufferByte クラスを使用して実行できます。データ バッファーから「byte[] ピクセル」配列を取得すると、生のピクセル値に直接アクセスできます。このメソッドは、特に大きな画像の場合、getRGB() を使用する場合と比較してパフォーマンスが向上します。
パフォーマンスの違いを示すために、提供されたコードでは 12000x12000 ピクセルの巨大な画像を使用して両方のアプローチを比較しています。この結果は、ピクセル アレイへの直接アクセスが大幅に高速であり、処理時間を 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; }
ピクセル アレイへの直接アクセスを利用することで、ピクセル データを効率的に抽出し、個々のピクセルに基づいてアドレス指定できます。 X 座標と Y 座標を基にして、画像操作や分析タスクに多用途でパフォーマンスの高いアプローチを提供します。
以上がJavaで画像からピクセルデータを整数配列として効率的に抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。