Newsgroup: it.comp.java
Titolo: sun.awt.image.DataBufferNative ? da dove salta fuori?

Ciao a tutti,
stò continuando a "giocare" con le immagini in java.. finalmente
credevo di aver finito. di aver trovato un modo per ottenere
l'immagine caricata pixel per pixel in un array e invece...
Schiantato ancora.
la cosa che a me suona molto strana è questa, Io ho scritto questo
metodo
public static int[] getPixels(BufferedImage im) {
    return ((DataBufferInt) im.getRaster().getDataBuffer()).getData();
}
Sia NetBeans che Eclipse, quando scrivo il metodo, mi danno gli stessi
tipi di ritorno. Ma non so per quale motivo quando vado in run ho
sempre questo errore.
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException:
sun.awt.image.DataBufferNative cannot be cast to
java.awt.image.DataBufferInt
        at myomr.imaging.prova.ImageTools.getIntPixels(ImageTools.java:
40)
Sapreste dirim da dove sbaglio?
Una fonte di errore sarebbe un metodo di conversione trovato in rete
per passare da un oggetto Image ad un oggetto BufferedImage? Se volete
darci un occhiata eccovi serviti
// This method returns a buffered image with the contents of an image
    public static BufferedImage toBufferedImage(Image image) {
        // Create a buffered image with a format that's compatible
with the screen
        BufferedImage bimage = null;
        if (!(image instanceof BufferedImage)){
            // This code ensures that all the pixels in the image are
loaded
            image = new ImageIcon(image).getImage();
            // Determine if the image has transparent pixels;
            boolean hasAlpha = hasAlpha(image);
            GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
            try {
                // Determine the type of transparency of the new
buffered image
                int transparency = Transparency.OPAQUE;
                if (hasAlpha) {
                    transparency = Transparency.BITMASK;
                }
                // Create the buffered image
                GraphicsDevice gs = ge.getDefaultScreenDevice();
                GraphicsConfiguration gc =
gs.getDefaultConfiguration();
                bimage = gc.createCompatibleImage(
                        image.getWidth(null), image.getHeight(null),
transparency);
            } catch (HeadlessException e) {
                // The system does not have a screen
            }
            if (bimage == null) {
                // Create a buffered image using the default color
model
                int type = BufferedImage.TYPE_INT_RGB;
                if (hasAlpha) {
                    type = BufferedImage.TYPE_INT_ARGB;
                }
                bimage = new BufferedImage(image.getWidth(null),
image.getHeight(null), type);
            }
            // Copy image to buffered image
            Graphics g = bimage.createGraphics();
            // Paint the image onto the buffered image
            g.drawImage(image, 0, 0, null);
            g.dispose();
        } else {
            bimage = (BufferedImage) image;
        }
        return bimage;
    }
    // This method returns true if the specified image has transparent
pixels
    private static boolean hasAlpha(Image image) {
        // If buffered image, the color model is readily available
        if (image instanceof BufferedImage) {
            BufferedImage bimage = (BufferedImage)image;
            return bimage.getColorModel().hasAlpha();
        }
        // Use a pixel grabber to retrieve the image's color model;
        // grabbing a single pixel is usually sufficient
        PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
        try {
            pg.grabPixels();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // Get the image's color model
        ColorModel cm = pg.getColorModel();
        return cm.hasAlpha();
    }
Spero che qualcuno di voi riesca a darmi un aiuto. è da 3 giorni che
non riesco a venirne fuori
Ciao a tutti
Marco

 sempre questo errore.
Il tipo di ritorno e' DataBuffer, non DataBufferInt

> Il tipo di ritorno e' DataBuffer, non DataBufferInt
DataBufferInt extends DataBuffer
per quello che effettuo il cast



eh ma il cast mica e' magico come potrebbe suggerire la parola
a parte questo, "getRGB" di BufferedImage non va bene per quello che vuoi
fare?

 fare?
Dovrei provare a darci un occhiata. il codice l'ho scritto
affidandomi, forse eccessivamente, a mamma Sun.
provo a buttarci un occhio. grazie per il suggerimento

 provo a buttarci un occhio. grazie per il suggerimento
se ti serve qualcosa di piu' specifico dell'RGB (ad esempio il canale
alpha) allora ti tocca il gia' suggerito PixelGrabber..... ma la javadoc
ha un esempio quindi dovrebbe essere facile.


non mi sembra di averlo fatto nel mio esempio o in altre occasioni

 uno molto simile nell'implemntazione
e ancora:


Se il metodo ritorna DataBuffer e tu lo forzi a DataBufferInt (per inciso:
non si chiama casting) è proprio quello che fai tu. Rivedi un'attimo il
concetto di casting, non esiste il concetto di "molto simile
nell'implemntazione".
Ciao :)

 nell'implemntazione".
Non sono stato molto ortodosso nell'esprimermi, quello lo ammetto
Ma se facessi errori del genere come mai il metodo se lo modifico in
questo modo
public static int[] getIntPixels(BufferedImage im) {
        DataBuffer db = im.getRaster().getDataBuffer();
        System.out.println(db.getClass());
        return ((DataBufferInt) db).getData();
    }
mi restituisce
Sull'immagine di destinazione
class java.awt.image.DataBufferInt
Sull'immagine sorgente
class sun.awt.image.DataBufferNative
???
Grazie comunque per la bella discussione che stiamo facendo

 ???
perche' non e' sbagliato dire che Marco Capoferri e' un membro della
famiglia Capoferri mentre e' perlomeno azzardato dire che un membro
(qualsiasi) della famiglia Capoferri e' per forza Marco Capoferri
getDataBuffer ti restituisce un membro della famiglia Capoferri. Se a
runtime gli chiedi il nome lui te lo dice ma se tu nel codice dichiari che
il suo nome e' Marco e a runtime Marco se ne va in piscina e
arriva Anastasia la virtual machine, che si era messa pure un po' di
ombretto per farsi bella, giustamente s'incazza.