ホームページ >Java >&#&チュートリアル >Java で BufferedImage からピクセル データを整数配列として効率的に抽出する方法

Java で BufferedImage からピクセル データを整数配列として効率的に抽出する方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-05 14:18:40612ブラウズ

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

Java で画像からピクセル データを整数配列として抽出する方法

BufferedImage は、ピクセル データを操作するためのさまざまなメソッドを提供します。ただし、これらの方法の中には、ピクセル情報に効率的にアクセスするには最適ではないものもあります。 Java でピクセル データを抽出するには、主に 2 つのアプローチが存在します。

  1. BufferedImage の getRGB() メソッドを使用する。

    このメソッドは、ピクセル カラーを整数として取得します。アルファ、赤、緑、青の値を組み合わせます。このアプローチは便利ですが、色情報をデコードして別のチャネルに再配置する必要があるため、時間がかかります。

  2. ピクセル配列への直接アクセス:

    ピクセル配列に直接アクセスするには、次を使用できます。 code:

    byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

    このメソッドは、各ピクセルの赤、緑、青の値への生のアクセスを提供します。アルファ チャネルがある場合は、それもバイト配列に含まれます。この方法ではより複雑なインデックス計算が必要ですが、getRGB() を使用するよりも大幅に高速です。

パフォーマンスの比較

ベンチマークは顕著な違いを示しています2 つのアプローチ間の処理時間の短縮。 getRGB() から直接配列アクセスに切り替えると、大きな画像を処理する際の速度が 90% 以上向上しました。パフォーマンスを比較するためのサンプル コードは次のとおりです。

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);
    }
}

ピクセル データを抽出するための最適なアプローチは、特定のニーズと、作業している画像のサイズと複雑さによって異なることに注意してください。

以上がJava で BufferedImage からピクセル データを整数配列として効率的に抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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