如何在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中文網其他相關文章!