PDA

View Full Version : [Java] Come manipolare un'immagine ?


Lakaj
12-02-2007, 18:41
Salve a tutti, mi interesserebbe sapere quale classe puo' permettermi di fare una scansione pixel a pixel di un'immagine .gif cioè sapere il colore del pixel in un dato punto ecc...
Magari indicatemi anche i metodi. Grazie

ciao

andbin
12-02-2007, 20:16
mi interesserebbe sapere quale classe puo' permettermi di fare una scansione pixel a pixel di un'immagine .gif cioè sapere il colore del pixel in un dato punto ecc...Innanzitutto puoi usare ImageIO.read() per ottenere un BufferedImage da un file immagine. La classe BufferedImage ha due metodi in overload getRGB. (vedi documentazione)

Griffo
12-02-2007, 20:26
PixelGrabber? (http://java.sun.com/j2se/1.5.0/docs/api/index.html)
Così, a caso... :mc:
:D

andbin
12-02-2007, 20:59
PixelGrabber? (http://java.sun.com/j2se/1.5.0/docs/api/index.html)
Certo ... anche PixelGrabber. Può essere comoda se hai solamente un generico oggetto Image/ImageProducer. Se hai un BufferedImage puoi già ottenere un array dei pixel con il metodo getRGB.

Lakaj
12-02-2007, 21:02
Innanzitutto puoi usare ImageIO.read() per ottenere un BufferedImage da un file immagine. La classe BufferedImage ha due metodi in overload getRGB. (vedi documentazione)
Grazie andbin, devo fare un progettino per l'uni in questi giorni...
Era quella che avevo in mente.
Si, ho visto anche pixelGrabber, ma quella ha funzioni particolari e il costruttore vuole oggetti di classi assurde, per quello che devo fare io mi basta una BufferedImage

Lakaj
13-02-2007, 08:27
Ho problemi con questo codice:

package analisiimmagine;
import java.awt.image.*;
import java.io.*;
import java.*;
import javax.imageio.*;
import javax.swing.*;
/**
*
* @author
*/
public class Immagine {

BufferedImage img;
int leggibile;
int w; //Widht
int h; //Height
int x;
int y;

public Immagine(File f) {
try {
img=ImageIO.read(f);
w = img.getWidth();
h = img.getHeight();
}
catch(IOException e) {
JOptionPane.showMessageDialog(null,"Eccezione...");
}
}
public int individuaInizioLettura() {
x=100;
y=100;
int color=img.getRGB(x,y);
int blue=color & 0x000000ff;
int green=(color & 0x0000ff00)>>8;
int red=(color & 0x00ff0000)>>16;
int alpha=(color & 0xff0000)>>24;
color=red*0x1000000+green*0x10000+blue*0x100+alpha;
JOptionPane.showMessageDialog(null,"Il colore è: " + color);
return 0;
}


}

Mi stampa -256.
Io in pratica voglio solo sapere se è bianco o diverso da bianco

lovaz
13-02-2007, 08:53
Ma le gif non sono indexed?
In pratica in ogni pixel non c'e' il colore in rgb,
ma l'indice nella tabella dei (256) colori...

Controlla con getType

andbin
13-02-2007, 09:19
public int individuaInizioLettura() {
x=100;
y=100;
int color=img.getRGB(x,y);
int blue=color & 0x000000ff;
int green=(color & 0x0000ff00)>>8;
int red=(color & 0x00ff0000)>>16;
int alpha=(color & 0xff0000)>>24;
color=red*0x1000000+green*0x10000+blue*0x100+alpha;
JOptionPane.showMessageDialog(null,"Il colore è: " + color);
return 0;
}

Mi stampa -256.
Io in pratica voglio solo sapere se è bianco o diverso da biancoInnanzitutto hai sbagliato quando calcoli 'alpha' e 'color'.

Ti conviene fare:
int rgb = img.getRGB(x,y) & 0xFFFFFF;

if (rgb == 0xFFFFFF) { // bianco
...
}Se vuoi stampare il valore, ti conviene fare:
JOptionPane.showMessageDialog(null,"Il colore è: " + Integer.toHexString(rgb));

Lakaj
13-02-2007, 09:22
Ho controllato, mi ritorna 13, che equivalrebbe a TYPE_BYTE_INDEXED
E quindi che devo fare ?

andbin
13-02-2007, 09:31
Ho controllato, mi ritorna 13, che equivalrebbe a TYPE_BYTE_INDEXED
E quindi che devo fare ?Il metodo getRGB(x,y) ritorna il colore sempre nel formato TYPE_INT_ARGB.

Lakaj
13-02-2007, 11:09
Scusate, ma non so fare proprio nulla...
Ho un problema con questo codice, voglio che mi stampi lungo la linea verticale dell'immagine dei pixel neri ma ho problemi con drawImage, mi visualizza un frame vuoto...

package analisiimmagine;
import java.awt.image.*;
import java.io.*;
import java.awt.*;
import javax.imageio.*;
import javax.swing.*;
/**
*
* @author
*/
public class Immagine extends JFrame {

BufferedImage img;
int leggibile; //Flag che indica se il sistema è in grado di leggere l'immagine
int w; //Widht
int h; //Height
int x;
int y;

public Immagine(File f) {
try {
img=ImageIO.read(f);
w = img.getWidth();
h = img.getHeight();
}
catch(IOException e) {
JOptionPane.showMessageDialog(null,"Eccezione");
}
}
public int individuaInizioLettura() {
x=10;
y=10;
int colore=0 & 0x000000;
int i=0,k=10;
while(i<8) {
img.setRGB(10,k,colore);
k+=10;
i++;
}
BufferedImage immagine = new BufferedImage(w,h, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g2 = immagine.createGraphics();
g2.drawImage(img,null,0,0);
g2.dispose();
pack();
setVisible(true);
return 0;
}


}
Mi aiutate ?

andbin
13-02-2007, 11:33
Questo programmino carica una immagine e disegna una riga rossa verticale.
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import javax.imageio.*;

public class TestFrame extends JFrame
{
private BufferedImage img;
private JLabel label;

public TestFrame (String filename)
{
super ("Test Frame");

setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (300, 300);

try
{
img = ImageIO.read (new File (filename));

Graphics2D g = img.createGraphics ();

g.setColor (Color.RED);
g.drawLine (0, 0, 0, img.getHeight ()-1);
g.dispose ();

label = new JLabel (new ImageIcon (img));

JScrollPane scrollPane = new JScrollPane (label,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

add (scrollPane);
}
catch (final Exception e)
{
SwingUtilities.invokeLater (new Runnable() {
public void run () {
JOptionPane.showMessageDialog (TestFrame.this, "Error: " + e);
}
});
}
}

public static void main (String[] args)
{
if (args.length == 1)
{
final String filename = args[0];

SwingUtilities.invokeLater (new Runnable() {
public void run () {
TestFrame f = new TestFrame (filename);
f.setVisible (true);
}
});
}
}
}

Lakaj
13-02-2007, 11:49
grazie 1000

Lakaj
13-02-2007, 15:18
Scusate la domanda stupidissima,

quando qui nei metodi si parla di x e y si intendono le coordinate degli assi normalmente, come in matematica vero ?

cioè

_________________________ asse x

e quello perpendicolare | è quello y

Si vero ?
Non per altro è che sto scrivendo tonnellate di codice su carta, senno' sbaglio tutto...

andbin
13-02-2007, 15:27
quando qui nei metodi si parla di x e y si intendono le coordinate degli assi normalmente, come in matematica vero ?Quasi .... devi prestare attenzione a dove è l'origine. Se non specificato diversamente, in genere l'origine degli assi è nell'angolo in alto a sinistra.

Lo dice ad esempio per BufferedImage: All BufferedImage objects have an upper left corner coordinate of (0, 0)

Lakaj
13-02-2007, 15:55
Quasi .... devi prestare attenzione a dove è l'origine. Se non specificato diversamente, in genere l'origine degli assi è nell'angolo in alto a sinistra.

Lo dice ad esempio per BufferedReader: All BufferedImage objects have an upper left corner coordinate of (0, 0)
Esatto, in effetti sono assi cartesiani in versione 2.0 :D
perchè scendendo verticalmente con le y i valori aumentano e l'origin è in alto a sx...

Lakaj
14-02-2007, 10:48
Esiste un metodo di qualche classe in Java che sia in grado di ruotare un'immagine di 180° ?

PGI-Bis
14-02-2007, 13:45
Puoi usare AffineTransformOp. Data l'immagine BufferedImage "source", la rotazione di 180° si ottiene con:

//rotazione di 180 intorno al centro
AffineTransform rotation = AffineTransform.getRotateInstace(
Math.PI,
source.getWidth() / 2,
source.getHeight() / 2);
BufferedImageOp rotationOp = new AffineTransformOp(rotation, null);
BufferedImage rotated = rotationOp.filter(source, null);