Problem mit PixelGrabber

Status
Nicht offen für weitere Antworten.

Shiroi

Mitglied
Hiho,

ich hab da ein Problem mit dem PxielGrabber. Ich möchte eine GIF Grafik mit transparenten Stellen bearbeiten, indem ich per PixelGrabber die einzelnen Pixel aus dem Bild hole, sie modifiziere und dann wieder in ein neues Image speichere.
Das Bild hat er mir erstellt, aber wenn ich es per Typecasting in ein BufferedImage umwandeln will, kommt ein Fehler, dass er es nicht casten konnte.
Um den Fehler ausfindig zu machen habe ich den Code aufs einfachste heruntergebrochen.

Code:
  <..>
  Image img = loadImage(s[start + y].split(";")[5] + "." + imgtype);

  int twidth = img.getWidth(null);
  int theight = img.getHeight(null);
  int pixels[] = new int[twidth * theight];

  PixelGrabber grabber = new PixelGrabber(img, 0, 0, twidth, theight, pixels, 0, twidth);

  try {
        grabber.grabPixels();
       }
  catch (InterruptedException e) {
                System.err.println("Error getting pixels");
       }

  Image active = createImage(new MemoryImageSource(twidth, theight,pixels, 0, twidth));
  <..>
  img[j][2] = (BufferedImage) got[j].getImageActive(); // holt das erstelle Image "active"

  <..>

Ich mach eigentlich nicht anderes (nur zum Test) außer die Pixel auszulesen und in ein neues Image umzuwandeln.
Warum mag er auf einmal das Typecasting nicht mehr?
Hoffentlich kann mir jemand weiterhelfen.

mfg DaAngel
 
geht die Umwandlung nicht?

Code:
BufferedImage active = (BufferedImage)createImage(new MemoryImageSource(twidth, theight,pixels, 0, twidth));
 
Man könnte ein neues BufferedImage anlegen mit breite und höhe des Bildes und dann das Graphics2D davon holen und darauf das Bild zeichnen, aber das hilft dir vermutlich nicht weiter.
 
Ich verstehe die Welt nicht mehr... ich habe extra nochmal ein neues Projekt angelegt um das zu testen. Wenn ich es ohne BufferedImage mache, dann geht es. Alles wird richtig berechnet und Angezeigt. Aber sobald ich das neuerstellte Bild Buffern will geht es nicht mehr....

Wenn ich mir die Bilder über System.out.println ausgeben lasse, sieht die Beschreibung des neuen Bildes auch schon einwenig komisch aus, dem fehlen die ganzen Attribute.

Original Bild:

BufferedImage@bb7759: type = 13 IndexColorModel: #pixelBits = 8 numComponents = 4 color space = java.awt.color.ICC_ColorSpace@1989f84 transparency = 2 transIndex = 127 has alpha = true isAlphaPre = false ByteInterleavedRaster: width = 60 height = 37 #numDataElements 1 dataOff[0] = 0

Bearbeitetes Bild:

sun.awt.windows.WImage@110c424

Auch wenn ich dann versuche das Bild in ein BufferedImage zu zeichnen, dann malt er mir nichts rein.

Hat jemand eine Idee, wie ich aus diesem bearbeiteten Bild wieder ein "richtiges" Bild machen kann?

€: Falls jemand den Code sehen will:

Code:
    private void pixelGrabber() {
    beforeimage = loadImage("t1.gif");
    int width = beforeimage.getWidth(null);
    int height = beforeimage.getHeight(null);
    int pixels[] = new int[width * height];
    int afterimagearray[] = new int[width * height];
    PixelGrabber grabber = new PixelGrabber(
        beforeimage, 0, 0, width, height, pixels, 0, width);

    try {
      grabber.grabPixels();
    }
    catch (InterruptedException e) {
      System.err.println("Error getting pixels");
    }


    for (int i = 0; i < pixels.length; i++) {
      Color col = new Color(pixels[i]);
      int red = col.getRed();
      int green = col.getGreen();
      int blue = col.getBlue();
      int alp = col.getAlpha();

      // Activ layer

      double[] vector = new double[3];
      if(red != 255 && green != 255 && blue != 255){
        vector[0] = red + 0.35 * (35 - red);
        vector[1] = green + 0.35 * (162 - green);
        vector[2] = blue + 0.35 * (53 - blue);
        Color newpixel = new Color( (int) vector[0], (int) vector[1],
                                   (int) vector[2], alp);
        afterimagearray[i] = newpixel.getRGB();
      }else{
        afterimagearray[i] = pixels[i];
      }
    }

    afterimage = createImage(new MemoryImageSource(width, height,
        afterimagearray, 0, width));
    repaint();
  }

  public void paint(Graphics g) {
    System.out.println(beforeimage);
    System.out.println(afterimage);
    
    beforebuffer = (BufferedImage)beforeimage; 
    g.drawImage(beforebuffer, 0, 60, null);
    afterbuffer = (BufferedImage)afterimage; 
    g.drawImage(afterbuffer, 60, 60, null);
  }
 
Yaayyy habs selber hinbekommen.

Der Trick war:

Code:
    Image buffer=createImage(width, height);  
    Graphics g2 = buffer.getGraphics();
    g2.drawImage(afterimage,0,0,this);

Dadurch hat er mir ein richtiges Bild erstellt, welches sich dann auch buffern lässt.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben