如何從 Java 中的圖像中提取像素資料作為整數數組
BufferedImage 提供了各種處理像素資料的方法。然而,其中一些方法對於有效存取像素資訊可能不是最佳的。在Java 中擷取像素資料有兩種主要方法:
使用BufferedImage 的getRGB() 方法:
此方法以整數形式擷取像素顏色,結合alpha、紅色、綠色和藍色值。雖然方便,但這種方法速度較慢,因為它需要解碼顏色資訊並將其重新排列到單獨的通道中。
直接存取像素數組:
要直接存取像素數組,可以使用以下程式碼:
byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();
此方法提供原始存取每個像素的紅色、綠色和藍色值。如果有 Alpha 通道,它也會包含在位元組數組中。雖然此方法需要更複雜的索引計算,但它比使用 getRGB() 快得多。
效能比較
基準測試顯示出顯著差異兩種方法之間的處理時間。從 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中文網其他相關文章!