الحصول على البيانات بكسل من الصورة باستخدام جافا
سؤال
وأنا أحاول الحصول على قيم بكسل RGB من صورة 64 x 48
قليلا. أحصل على بعض القيم ولكن في مكان قريب من القيم 3072 (= 64 x 48)
أن أتوقع. وأود أيضا أن تحصل على:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
at sun.awt.image.ByteInterleavedRaster.getDataElements(ByteInterleavedRaster.java:301)
at java.awt.image.BufferedImage.getRGB(BufferedImage.java:871)
at imagetesting.Main.getPixelData(Main.java:45)
at imagetesting.Main.main(Main.java:27)
وأنا لا يمكن العثور على خطأ من الحدود ...
وهنا رمز:
package imagetesting;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.image.BufferedImage;
public class Main {
public static final String IMG = "matty.jpg";
public static void main(String[] args) {
BufferedImage img;
try {
img = ImageIO.read(new File(IMG));
int[][] pixelData = new int[img.getHeight() * img.getWidth()][3];
int[] rgb;
int counter = 0;
for(int i = 0; i < img.getHeight(); i++){
for(int j = 0; j < img.getWidth(); j++){
rgb = getPixelData(img, i, j);
for(int k = 0; k < rgb.length; k++){
pixelData[counter][k] = rgb[k];
}
counter++;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static int[] getPixelData(BufferedImage img, int x, int y) {
int argb = img.getRGB(x, y);
int rgb[] = new int[] {
(argb >> 16) & 0xff, //red
(argb >> 8) & 0xff, //green
(argb ) & 0xff //blue
};
System.out.println("rgb: " + rgb[0] + " " + rgb[1] + " " + rgb[2]);
return rgb;
}
}
المحلول
وهذا ما يلي:
for(int i = 0; i < img.getHeight(); i++){
for(int j = 0; j < img.getWidth(); j++){
rgb = getPixelData(img, i, j);
لا يتطابق مع هذا:
private static int[] getPixelData(BufferedImage img, int x, int y) {
ولقد i
عد الصفوف وj
الأعمدة، أي i
يحتوي <م> ص م> القيم وj
تحتوي <م> س م> القيم. هذا إلى الوراء.
نصائح أخرى
وهذا يعمل أيضا:
BufferedImage img = ImageIO.read(file);
int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
وكنت أبحث عن هذه القدرة نفسها. لا أريد أن أعدد الصورة بأكملها، لذلك فعلت بعض البحث واستخدام PixelGrabber.
Image img = Toolkit.getDefaultToolkit().createImage(filename);
PixelGrabber pg = new PixelGrabber(img, 0, 0, -1, -1, false);
pg.grabPixels(); // Throws InterruptedException
width = pg.getWidth();
height = pg.getHeight();
int[] pixels = (int[])pg.getPixels();
هل يمكن استخدام int[]
مباشرة هنا، بكسل هي في شكل تمليه نموذج لوني من pg.getColorModel()
، أو يمكنك تغيير ذلك كاذبة إلى true وإجبارها على أن تكون RGB8 في و[إينتس].
ولقد قمت منذ اكتشفت أن الطبقات Raster
وصورة يمكن أن تفعل ذلك أيضا، وكانت هناك بعض فئات مفيدة وأضاف في javax.imageio.*
.
BufferedImage img = ImageIO.read(new File(filename)); // Throws IOException
int[] pixels = img.getRGB(0,0, img.getWidth(), img.getHeight, null, 0, img.getWidth());
// also available through the BufferedImage's Raster, in multiple formats.
Raster r = img.getData();
int[] pixels = r.getPixels(0,0,r.getWidth(), r.getHeight(), (int[])null);
وهناك عدة طرق getPixels(...)
في Raster
كذلك.
وint argb = img.getRGB(x, y);
التعليمات البرمجية
وint argb = img.getRGB(y, x);
التغييرات بلدي الآن يعمل
وتضطر إلى تغيير:
for(int i = 0; i < img.getHeight(); i++){
for(int j = 0; j < img.getWidth(); j++){
rgb = getPixelData(img, i, j);
في
for(int i = 0; i < img.getWidth(); i++){
for(int j = 0; j < img.getHeight(); j++){
rgb = getPixelData(img, i, j);
ولأن المعلمة الثانية من getPixelData
هي القيمة x
وthirth هو القيمة y
. قمت بالتبديل المعلمات.
لماذا لم تستخدم فقط استخدام:
public int[] getRGB(int startX,
int startY,
int w,
int h,
int[] rgbArray,
int offset,
int scansize)
ولقد بنيت في ذلك، رجل.