Newsgroup: it.comp.java
Titolo: Bug in grabPixels() ?

Ciao a tutti,
uso spesso grabPixels() perche' mi piace elaborare immagini con Java, ma
c'e' un caso in cui il funzionamento di PixelGrabber non mi convince, e
cioe' quando l'immagine da inserire nell'array e' prodotta partendo da
createImage(w,h) e poi disegnata con i vari metodi drawXXX(). Diversamente
dal caso in cui l'immagine venga da un file, secondo me ci sono dei problemi
nel modo in cui l'immagine viene letta e trasferita nell'array. Nel
dettaglio, io ho JDK 1.0.2, IE4 e HotJava. Riporto qui sotto il codice
completo di una semplice applet che crea un'immagine off-screen, la colora e
poi scrive una stringa. Visualizza l'immagine, poi la trasferisce in un
array, poi dall'array di nuovo in un'immagine che viene visualizzata. Con
l'appletviewer del JDK 1.0.2 la seconda immagine e' identica alla prima
(come mi aspetto), ma sia con IE4 che con HotJava (che usa il runtime 1.1.6)
la seconda immagine e' diversa. Qualcuno di voi sa dirmi se sono io a
sbagliare o se c'e' un problema in grabPixels() ? E in questo caso, esiste
un workaround?
Se qualcuno ne ha voglia, puo' fare una prova con un po' di copia e incolla.
Grazie
Luciano Vernaschi
************
sorgente
************
import java.applet.*;
import java.awt.*;
import java.awt.image.*;
public final class GrabPixelsTest
  extends Applet implements Runnable {
  int width, height;
  Thread workThread;
  Color bg, fg;
  public void init() {
    width = size().width;
    height = size().height;
    bg = readColorParameter("BgColor", new Color(0,0,0));
    setBackground(bg);
    getParent().setBackground(bg);
    getParent().repaint();
    fg = readColorParameter("FgColor", new Color(255,255,255));
  }
  Color readColorParameter(String parameter, Color value) {
    try {
      value = new Color(Integer.parseInt(getParameter(parameter), 16));
    } catch (Exception e) {
      System.out.println
        ("Parameter \"" + parameter + "\" not found: using default");
    }
    return value;
  }
  public void start() {
    if (workThread == null) workThread = new Thread(this);
    workThread.start();
  }
  public void stop() {
    if (workThread != null) {
      workThread.stop();
      workThread = null;
    }
  }
  public void run() {
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
    while (Thread.currentThread() == workThread) {
      int area = width * height;
      Image img = createImage(width, height);
      Graphics cg = img.getGraphics();
      cg.setColor(bg);
      cg.fillRect(0, 0, width, height);
      cg.setColor(fg);
      cg.setFont(new Font("Helvetica", Font.BOLD, 30));
      FontMetrics fontMetrics = cg.getFontMetrics();
      cg.drawString("Ciao!",
        (width - fontMetrics.stringWidth("Ciao!")) / 2,
        (height - fontMetrics.getAscent() -
        fontMetrics.getDescent()) / 2 +
        fontMetrics.getAscent());
      getGraphics().drawImage(img, 0, 0, null);
      try { Thread.currentThread().sleep(5000); }
      catch (InterruptedException e) {}
      getGraphics().fillRect(0, 0, width, height);
      try { Thread.currentThread().sleep(1000); }
      catch (InterruptedException e) {}
      int pixels[] = new int[area];
      PixelGrabber pixelGrabber =
        new PixelGrabber(img, 0, 0, width, height,
          pixels, 0, width);
      try {
        pixelGrabber.grabPixels();
      } catch (InterruptedException e) {
        System.out.println("Exception in grabPixels()");
      }
      Image img2 = createImage(new MemoryImageSource(width,
        height, pixels, 0, width));
      getGraphics().drawImage(img2, 0, 0, null);
      try { Thread.currentThread().sleep(5000); }
      catch (InterruptedException e) {}
      getGraphics().fillRect(0, 0, width, height);
      try { Thread.currentThread().sleep(3000); }
      catch (InterruptedException e) {}
    }
  }
}
************
file HTML
************
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Prova di grabPixels()</title>
</head>
<body bgcolor="#000000" text="#FFFFFF" link="#FFFF00"
vlink="#FFFF00" alink="#FFFF00">
<p align="center">Prova di grabPixels()</p>
<p align="center"><applet code="GrabPixelsTest.class"
align="baseline" width="250" height="150"><param name="BgColor"
value="99FF99"><param name="FgColor" value="000099"></applet></p>
</body>
</html>

 Unite for Java - Join the Java Lobby now! (
http://www.javalobby.org
)     <
============================================================================