View Full Version : [Java] Come manipolare un'immagine ?
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
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)
PixelGrabber? (http://java.sun.com/j2se/1.5.0/docs/api/index.html)
Così, a caso... :mc:
:D
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.
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
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
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
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));
Ho controllato, mi ritorna 13, che equivalrebbe a TYPE_BYTE_INDEXED
E quindi che devo fare ?
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.
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 ?
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);
}
});
}
}
}
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...
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)
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...
Esiste un metodo di qualche classe in Java che sia in grado di ruotare un'immagine di 180° ?
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);
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.