PDA

View Full Version : [Java] Manipolazione immagini: libreria?


Finalfire
23-06-2007, 12:12
Salve ragazzi, volevo domandare se esistesse qualche libreria per la manipolazione delle immagini in Java. Un po' come le GD per PHP, intendo :D
Spero in una risposta,
Grazie :^

PGI-Bis
23-06-2007, 12:29
Credo che gli oggetti che cerchi si trovino già nella piattaforma standard, nei package

java.awt
java.awt.image
java.awt.geom
javax.imageio

Uno stringatissimo esempio in pseudo codice:

BufferedImage immagine = new BufferedImage(100, 100, BufferedImage.INT_ARGB);

Crea un'immagine "in memoria" di 100x100 pixel.

Graphics2D graphics = immagine.createGraphics();

qui "graphics" è un riferimento ad un oggetto che serve per creare figure ed effetti vettoriali sull'immagine. Ad esempio:

Rectangle2D rettangolo = new Rectangle(0, 0, 50, 50);
Paint colore = new Color(100, 0, 100);
graphics.setPaint(colore);
graphics.fill(rettangolo);

disegna un quadrato colorato nell'immagine da cui hai ottenuto il graphics.

Per trasformare "immagine" in formato png, jpg, bmp, usi ImageIO:

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ImageIO.write(image, "png", buffer);
byte[] pngData = buffer.toByteArray();

In questo caso uso un ByteArrayOutputStream prevedendo la necessità di inviare l'immagine ad un client di rete.

Ci sono poi tutta una serie di classi per le trasformazioni per pixel genere sfumatura, rilievo, conversioni di colore eccetera.

Questo nelle librerie della piattaforma standard. Ci sono poi altre librerie per manipolazioni più complesse o semplicemente fatte in modo diverso. Ad esempio JAI o ImageJ.

Finalfire
23-06-2007, 15:25
Grazie per la risposta :D
Se avro' altri problemi postero' ^^

Finalfire
23-06-2007, 17:05
Doh. Un problema.

Ho da creare un background per il mio oggetto BufferedImage. Il background e' presente come file esterno (.png). Ho pensato di usare il metodo drawImage ma non riesco ad usarlo.
Piu' che altro, qual'e' il metodo migliore per caricare un'immagine esterna per poi "scriverla" nella mia immagine (mettendo da parte l'uso di BufferedImage)?

EDIT: risolto. Sto' usando il Toolkit di java.awt

PGI-Bis
23-06-2007, 19:03
BufferedImage sfondo = ImageIO.read(un url o un file)

Graphics2D graphics = immagine.createGraphics();
graphics.drawImage(sfondo, 0, 0, null);

Finalfire
23-06-2007, 19:15
Uhm...
Ho risolto nel ricavare l'immagine ma non riesco a "disegnarla" nel BufferedImage.
Ho scritto una prova:
import java.awt.Image.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.awt.*;
import javax.imageio.*;
import java.io.*;

public class ModifyImage {

private Graphics2D myG2D;

public ModifyImage() {
// carico l'immagine
Image img = Toolkit.getDefaultToolkit().getImage( "back.png" );
// creo un buffer per la nuova immagine
BufferedImage bImg = new BufferedImage( 250, 68, BufferedImage.TYPE_INT_RGB );
// creo un nuovo file, destinato a contenere la mia immagine
File imgFile = new File("newfile.png");
// ora posso graficare sul buffer
myG2D = bImg.createGraphics();
// prima il back, poi il color usato, poi provo
myG2D.setBackground( Color.BLACK );
myG2D.drawImage(img, 0, 0, null);
typeText( myG2D, "myG2D", Color.WHITE, 10, 20 );
// provo
try {
ImageIO.write( bImg, "png", imgFile );
} catch ( IOException e ) {
e.printStackTrace();
}
}

private void typeText( Graphics2D obj, String text, Color c, int x, int y ) {
obj.setColor( (Color) c );
obj.drawString( text, x, y );
}

public static void main(String[] args) {
ModifyImage start = new ModifyImage();
}
}
... ma niente :(

Finalfire
23-06-2007, 19:21
BufferedImage sfondo = ImageIO.read(un url o un file)

Graphics2D graphics = immagine.createGraphics();
graphics.drawImage(sfondo, 0, 0, null);
Grazie :D Non avevo pensato ad usare il read, anche perche' mi sembrava dispendioso usare un BufferedImage per i casi a cui la webapps incontra.
Ma grazie comunque :p

Anyway, sapresti spiegarmi come mai quel codice da me postato non funziona?

PGI-Bis
23-06-2007, 19:46
Non so perchè il codice che hai incollato non funzioni. Forse funziona ma non si vede. L'immagine caricata dal file potrebbe avere un canale alfa, essendo una png. L'immagine di destinazione non ce l'ha (RGB anzichè ARGB). Forse nella conversione di formato da ARGB a RGB si perde i colori per strada. Ma è un forse che sa di magia. L'ultima volta che ho usato Toolkit è stato per aiutare Noè a costruire la barca. Parecchio tempo fa.

Finalfire
23-06-2007, 20:28
Non so perchè il codice che hai incollato non funzioni. Forse funziona ma non si vede. L'immagine caricata dal file potrebbe avere un canale alfa, essendo una png. L'immagine di destinazione non ce l'ha (RGB anzichè ARGB). Forse nella conversione di formato da ARGB a RGB si perde i colori per strada. Ma è un forse che sa di magia. L'ultima volta che ho usato Toolkit è stato per aiutare Noè a costruire la barca. Parecchio tempo fa.
Questa e' da cit. XD
Grazie comunque, cerchero' di attenermi al metodo da te descritto.