ホームページ >Java >&#&チュートリアル >Javaで画像からピクセルデータを整数配列として効率的に抽出するにはどうすればよいですか?

Javaで画像からピクセルデータを整数配列として効率的に抽出するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-19 18:17:081033ブラウズ

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

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。