|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[Java] Visualizzare un'immagine e poi applicargli un filtro
Salve ragazzi,
premetto che stò chiedendo 2 cose diverse in questo 3d...la prima domanda è sicuramente più facile e molti di voi mi sapranno rispondere...per quanto riguarda la seconda spero di trovare qualcuno che abbia già avuto modo di mettere mano all'applicazione di filtri su un'immagine tramite Java. Seguendo questo articolo (a dire il vero per ora solo la primissima parte dell'articolo): http://www.jhlabs.com/ip/blurring.html stò tentando di fare la seguente cosa: Una classe che contiene il metodo main che: 1) Visualizza un'immagine JPG (prima domanda su come fare) 2) Ne crea un'altra applicando un filtro blurring all'immagine iniziale (seconda domanda) 3) Visualizza o salva da qualche parte l'immagine modificata Come detto si tratta di 2 domande...una probabilmetne facile (su come far visualizzare in Java un'immagine...credo tramite Swing) ed un'altra più complicata riguardante l'applicazione del filtro di blurring Premetto che non ho mai lavorato con Swing ed in generale poco con applicazioni desktop (mi sono occupate principalmente di web application e di mobile application...Android) Cercando di mettere insieme la primissima parte dell'articolo con dell'altro materiale trovato in rete ho scritto questo pezzo di codice: Codice:
import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import javax.swing.ImageIcon; public class blur1 { public static void main(String [ ] args){ float[] matrix = new float[400]; for (int i = 0; i < 400; i++) matrix[i] = 1.0f/400.0f; ImageIcon icon = new ImageIcon("/home/andrea/Scrivania/pesce-pagliaccio.jpg"); Image image = icon.getImage(); BufferedImage imageOriginal = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2Original = imageOriginal.createGraphics(); g2Original.drawImage(image, icon.getIconWidth(), icon.getIconHeight(), null); ImageIcon icon2 = new ImageIcon("/home/andrea/Scrivania/pesce-pagliaccio.jpg"); Image image2 = icon2.getImage(); BufferedImage imageDestination = new BufferedImage(icon2.getIconWidth(), icon2.getIconHeight(), BufferedImage.TYPE_INT_RGB); BufferedImageOp op = new ConvolveOp( new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null ); BufferedImage blurredImage = op.filter(imageOriginal, imageDestination); } } Codice:
ImageIcon icon = new ImageIcon("/home/andrea/Scrivania/pesce-pagliaccio.jpg"); Image image = icon.getImage(); BufferedImage imageOriginal = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2Original = imageOriginal.createGraphics(); g2Original.drawImage(image, icon.getIconWidth(), icon.getIconHeight(), null); Per la seconda domanda che è ben più complessa...beh intanto risolviamo questa...poi quella la formulo bene dopo ![]() Tnx Andrea |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Andiamo con ordine, partiamo con il caricamento e la visualizzazione di un'immagine.
Ci sarebbero diverse opzioni, io te ne dico una. Per caricare un'immagine (jpg, png, giff e non mi ricordo se/che altro... ) puoi usare javax.imageio.ImageIO Ad esempio: Codice:
File imagePath = new File(strFolderPath, strFileName); ... Image image = ImageIO.read(file);//could throws IOException // a ImageIO.read puoi anche passare un InputStream oppure un URL Codice:
... JLabel picture = new JLabel(new ImageIcon(image)); ... Codice:
JFrame frame = new JFrame("blablabla"); ... JScrollPane picturePane = new JScrollPane(picture); picturePane.getVerticalScrollBar().setUnitIncrement(18); picturePane.getHorizontalScrollBar().setUnitIncrement(18); ... fame.add(picturePane, BorderLayout.CENTER); ...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 23-09-2011 alle 14:08. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Ti ringrazio molto...sei stato molto chiaro, credo di aver afferrato i concetti dei menu con Swing ache se non lo conosco come sistema perchè non l'ho mai usato...
Ma continuo ad avere qualche problema...sostanzialmente non mi dà errori e nella console appaiono anche i messaggi dei vari System.out.println inseriti all'interno del mio codice ma...facendo partire il progetto da Eclipse (RUN AS --> JAVA APPLICATION) non viene visualizzata da nessuna parte l'immagine...come mai? Questo è il mio codice completo: Codice:
package andrea.blur1.classi; import java.awt.BorderLayout; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.management.ImmutableDescriptor; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; public class blur1 { public static void main(String [] args) throws IOException{ String strFolderPath = "/home/andrea/Scrivania/"; // Percorso immagine da aprire String strFileName = "pesce-pagliaccio.jpg"; // Nome file immagine da aprire File imagePath = new File(strFolderPath, strFileName); // Contiene il riferimento al file da aprire System.out.println("imagePath punta a: " + imagePath); Image image = ImageIO.read(imagePath); // Mette dentro image l'immagine a cui fà riferimento imagePath System.out.println("Info immagine: " + image.toString()); JLabel picture = new JLabel(new ImageIcon(image)); // Istanzio un'ImageIcon da image e la uso come icona in una JLabel JFrame frame = new JFrame("blablabla"); // E' un container JScrollPane picturePane = new JScrollPane(picture); // E' una view scrollabile che contiene la JLabel che ha l'ImageIcon come icona System.out.println(picturePane.toString()); // Setta le scrollbar verticale ed orizzontale: picturePane.getVerticalScrollBar().setUnitIncrement(18); picturePane.getHorizontalScrollBar().setUnitIncrement(18); frame.add(picturePane, BorderLayout.CENTER); // Aggiunco il picturPane al frame esterno e gli dico di posizionarlo al centro System.out.println(frame.getComponentCount()); } } ma come mai non si vede da nessuna parte l'immagine? Possibile che dipenda dal fatto che lo lancio in Eclipse? O c'è qualcosa che mi sfugge? Tnx Andrea |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Codice:
String strFolderPath = "/home/andrea/Scrivania/"; ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
che dovrei fare? come gli dovrei passare il percorso? Tnx Andrea |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Jul 2010
Messaggi: 70
|
Quote:
invece, se fai partire da progetto di eclipse, devi mettere l'indirizzo partendo dalla workpath di eclipse. |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
tramite Eclipse ho creato una cartella chiamata img allo stesso livello della cartella src Dentro img ho messo l'immagine: pesce pagliaccio.jpg ed ho cambiato le righe relative all'indirizzo del file nel seguente modo: Codice:
String strFolderPath = "/blur1/img/"; // Percorso immagine da aprire String strFileName = "pesce-pagliaccio.jpg"; // Nome file immagine da aprire Il problema ora è che quando lo lancio nella console mi dà il seguente messaggio di errore: Codice:
imagePath punta a: /blur1/img/pesce-pagliaccio.jpg Exception in thread "main" javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(ImageIO.java:1275) at andrea.blur1.classi.blur1.main(blur1.java:31) Non ne riesco ad uscire...sono 2 giorni che ci sbatto la capoccia...qualcuno sà aiutarmi? Tnx Andrea |
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jul 2010
Messaggi: 70
|
La cosa mi pare strana. Hai provato invece di una piattaforma posix di farla girare su Win? E cambiare ovviamente il percorso
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
Codice:
frame.setVisible(true); Ora non tira fuori nessuna eccezione relativa al file pescepagliaccio.jpg quindi penso che il file jpg sia caricato correttamente adesso e che l'indirizzo sia giusto (credo...se no tirerebbe fuori l'eccezionel...giusto?) Per caso bisogna dirgli di visualizzare qualcos'altro? Mi sai aiutare? sarà una cavolata ma non ho mai messo mano alle Swing e ci stò impazzendo... Per completezza di posto il mio nuovo codice: Codice:
import java.awt.BorderLayout; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.management.ImmutableDescriptor; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; public class blur1 { public static void main(String [] args) throws IOException{ String strFolderPath = "/home/andrea/workspace2/blur1/img/"; // Percorso immagine da aprire String strFileName = "pesce-pagliaccio.jpg"; // Nome file immagine da aprire File imagePath = new File(strFolderPath, strFileName); // Contiene il riferimento al file da aprire System.out.println("imagePath punta a: " + imagePath); Image image = ImageIO.read(imagePath); // Mette dentro image l'immagine a cui fà riferimento imagePath System.out.println("Info immagine: " + image.toString()); JLabel picture = new JLabel(new ImageIcon(image)); // Istanzio un'ImageIcon da image e la uso come icona in una JLabel JFrame frame = new JFrame("blablabla"); // E' un container frame.setVisible(true); JScrollPane picturePane = new JScrollPane(picture); // E' una view scrollabile che contiene la JLabel che ha l'ImageIcon come icona picturePane.setVisible(true); System.out.println(picturePane.toString()); // Setta le scrollbar verticale ed orizzontale: picturePane.getVerticalScrollBar().setUnitIncrement(18); picturePane.getHorizontalScrollBar().setUnitIncrement(18); frame.getContentPane().add(picturePane, BorderLayout.CENTER); // Aggiunco il picturPane al frame esterno e gli dico di posizionarlo al centro System.out.println(frame.getComponentCount()); } } Andrea |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Risolto da me...il problema era che senza settare le dimensioni del Jframe con un setSize() non si visualizzava...è obbligatorio o usare il setSize() o il pack() (setta le dimensioni del frame con le dimensioni dell'immagine che esso contiene) altrimenti non si vedrà nulla
![]() |
![]() |
![]() |
![]() |
#11 | |
Member
Iscritto dal: Jul 2010
Messaggi: 70
|
Quote:
Meglio così ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:20.