PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java PixelGrabber


DocEW
2007-10-16, 10:37:58
Hallo zusammen,

ich habe ein kleines (Verständnis?-)Problem mit dem java.awt.image.PixelGrabber.
Folgender Code sollte m.E. zwei horizontale Linien (aus '0' und '1' bestehend) in der Konsole ausgeben, tut er aber nicht. :(
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;

public class PixelGrabberTest {

public void rasterize(int totalWidth, int totalHeight) {
Image image = new BufferedImage(totalWidth, totalHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D)image.getGraphics();
paint(graphics);

int[] pixels = new int[totalWidth*totalHeight];
PixelGrabber pg = new PixelGrabber(image, 0, 0, totalWidth, totalHeight, pixels, 0, totalWidth);

try {
pg.grabPixels();

if (pixels != null) {
for(int i = 0; i < totalHeight; i++) {
for (int j = 0; j < totalWidth; j++) {
System.out.print((pixels[j+i*totalHeight] & 1));
}
System.out.println();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public void paint(Graphics g) {
g.drawLine(0,0,10,0);
g.drawLine(0,2,10,2);
}

public static void main(String[] args) {
PixelGrabberTest pixelGrabberTest = new PixelGrabberTest();
pixelGrabberTest.rasterize(20, 5);
}
}
Die Ausgabe ist merkwürdig verschoben:
11111111111000000000
11111100000000000000
10000000000000000000
00000000000000000000
00000000000000000000
Ich habe schon einiges ge-Google-d und getestet, krieg's aber nicht hin.
Für Hilfe wäre ich sehr dankbar!

DocEW

wry
2007-10-16, 12:38:26
Folgender Code sollte m.E. zwei horizontale Linien (aus '0' und '1' bestehend) in der Konsole ausgeben, tut er aber nicht.

Du meinst wohl 5 horizontale Linien, bestehend je aus 20 Zeichen?

Die Schleife wandert ja für jede Zeile (Höhe = 5) alle Spalteneinträge ab (Breite = 20).

DocEW
2007-10-16, 13:03:04
Du meinst wohl 5 horizontale Linien, bestehend je aus 20 Zeichen?

Die Schleife wandert ja für jede Zeile (Höhe = 5) alle Spalteneinträge ab (Breite = 20).
War etwas missverständlich ausgedrückt:
'0' ist der Hintergrund und mit '1' zeichne ich. Insofern sollten 2 "Linien" auf "Hintergrund" zu sehen sein. ;)

wry
2007-10-16, 14:20:58
Dachte ich mir schon, dass ich das falsch verstanden hab :redface:

Hab hier schnell einen Code zusammengebastelt, mit Hilfe der JavaDoc, der funktioniert. Ich glaube der Fehler liegt irgendwo in der Ausgabefunktion bzw. in der Art wie du sie berechnest.


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.awt.image.PixelGrabber;

public class PixelGrabberTest {

public void rasterize(int breite, int hoehe) { //20,5
Image image = new BufferedImage(breite, hoehe, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D)image.getGraphics();

graphics.drawLine(0,0,10,0);
graphics.drawLine(0,2,10,2);

handlepixels(image, 0, 0, breite, hoehe);
}


public void handlesinglepixel(int x, int y, int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel ) & 0xff;

if(red == 255 || green == 255 || blue == 255 )
System.out.print("1");
else
System.out.print("0");
}

public void handlepixels(Image img, int x, int y, int w, int h) {

int[] pixels = new int[w * h];
PixelGrabber pg = new PixelGrabber(img, x, y, w, h, pixels, 0, w);
try {
pg.grabPixels();
} catch (InterruptedException e) {
System.err.println("interrupted waiting for pixels!");
return;
}
if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
System.err.println("image fetch aborted or errored");
return;
}
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
handlesinglepixel(x+i, y+j, pixels[j * w + i]);
}
System.out.println();
}
}

public static void main(String[] args) {
PixelGrabberTest pixelGrabberTest = new PixelGrabberTest();
pixelGrabberTest.rasterize(20, 5);
}
}

DocEW
2007-10-16, 16:39:11
Argh, wie blöd!! Ersetze
System.out.print((pixels[j+i*totalHeight] & 1));
durch
System.out.print((pixels[j+i*totalWidth] & 1));
X-D

Vielen Dank!!