Cara Mengekstrak Data Pixel daripada Imej sebagai Tatasusunan Integer dalam Java
Apabila bekerja dengan imej di Java, mungkin ada kalanya anda perlu mengakses data piksel dengan cara yang cekap. Data ini boleh menjadi berharga untuk pelbagai tugas pemprosesan imej, seperti manipulasi piksel, analisis warna dan visualisasi data.
1. Menggunakan Kaedah getRGB():
Kelas BufferedImage dalam Java menyediakan kaedah mudah dipanggil getRGB(). Kaedah ini mengembalikan integer yang mewakili warna piksel tertentu dalam imej. Dengan mengulangi keseluruhan imej, anda boleh mengekstrak semua nilai piksel dan menyusunnya dalam tatasusunan integer 2D. Walau bagaimanapun, pendekatan ini boleh menjadi mahal dari segi pengiraan untuk imej yang besar.
2. Akses Tatasusunan Piksel Terus:
Pendekatan alternatif ialah mengakses terus tatasusunan piksel asas dalam BufferedImage. Ini boleh dilakukan menggunakan kelas DataBufferByte. Dengan mendapatkan tatasusunan 'bait[] piksel' daripada penimbal data, anda mempunyai akses terus kepada nilai piksel mentah. Kaedah ini menawarkan prestasi yang lebih baik berbanding menggunakan getRGB(), terutamanya untuk imej besar.
Untuk menggambarkan perbezaan prestasi, kod yang disediakan membandingkan kedua-dua pendekatan menggunakan imej besar 12000x12000 piksel. Hasilnya jelas menunjukkan bahawa akses tatasusunan piksel langsung jauh lebih pantas, mengurangkan masa pemprosesan lebih daripada 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; }
Dengan menggunakan akses tatasusunan piksel langsung, anda boleh mengekstrak data piksel dengan cekap dan menangani piksel individu berdasarkan pada koordinat x dan y mereka, memberikan anda pendekatan yang serba boleh dan berprestasi untuk tugasan manipulasi dan analisis imej.
Atas ialah kandungan terperinci Bagaimana untuk Mengekstrak Data Piksel dengan Cekap daripada Imej sebagai Tatasusunan Integer di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!