Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Da immagine a testo.
Forum - Java - Da immagine a testo.

Avatar
crashoverride (Ex-Member)
Rookie


Messaggi: 39
Iscritto: 12/12/2010

Segnala al moderatore
Postato alle 21:48
Mercoledì, 22/12/2010
Come da titolo vorrei fare in Java un programma che prende un immagine in Input ed in Output dia un'altra immagine ma formato da testo...
Per ora ho scritto le seguenti classi:

Classe per la GUI
Codice sorgente - presumibilmente Java

  1. import javax.swing.*;
  2. import java.awt.BorderLayout;
  3. import java.awt.image.*;
  4.  
  5. public class ImageToTextGUI {
  6.         private JFrame f;
  7.         private JPanel p;
  8.         private JLabel image;
  9.        
  10.         ImageToTextGUI(){
  11.                 f = new JFrame("Image2Text");
  12.                 BufferedImage bi = JImageLoader.loadImage("/Users/nicolagheza/Desktop/immagine.jpg");
  13.                 BufferedImage icon = JImageLoader.getImageIcon(bi);
  14.                 ImageIcon imageIcon = new ImageIcon(icon);
  15.                 image = new JLabel();
  16.                 image.setIcon(imageIcon);
  17.                 f.add(image, BorderLayout.CENTER);
  18.                 f.pack();
  19.                 f.setVisible(true);
  20.         }
  21.        
  22.         public static void main(String args[]){
  23.                 new ImageToTextGUI();
  24.         }
  25. }



Classe JImageLoader
Codice sorgente - presumibilmente Java

  1. import java.awt.Graphics2D;
  2. import java.awt.RenderingHints;
  3. import java.awt.image.*;
  4. import javax.imageio.ImageIO;
  5. import java.io.*;
  6. import javax.swing.*;
  7.  
  8. public class JImageLoader{
  9.        
  10.         /**
  11.          * This method allows to load an Image.
  12.          * @param url It's the path of the image.
  13.          * @return It return a BufferedImage object contains the Image we want to add.
  14.          */
  15.        
  16.         public static BufferedImage loadImage(String url){
  17.                 BufferedImage loaded = null;
  18.                 try {
  19.                         loaded = ImageIO.read(new File(url));
  20.                 }catch(IOException e){
  21.                         e.printStackTrace();
  22.                 }
  23.                 return loaded;
  24.         }
  25.        
  26.  
  27.         public static BufferedImage getImageIcon(BufferedImage bufferedImage){
  28.                
  29.                 int newW = 100;
  30.                 int newH = 100;
  31.                 int h = bufferedImage.getHeight();
  32.                 int w = bufferedImage.getWidth();
  33.                 BufferedImage bi = new BufferedImage(newW, newH, bufferedImage.getType());
  34.  
  35.                 Graphics2D g = bi.createGraphics();
  36.                
  37.                 g.drawImage(bufferedImage, 0, 0, newW, newH, 0, 0, w, h, null);
  38.                 g.dispose();
  39.                 return bi;
  40.         }
  41.        
  42. }



Ora dovrei fare la classe per fare quello che ho detto ma non sò come iniziare consigli? :)

Grazie!

In caso non avreste capito vorrei fare una cosa del genere:



crashoverride ha allegato un file: sample.gif (42519 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da crashoverride il 22/12/2010 alle 22:38
PM
Avatar
paoloricciuti (Ex-Member)
Pro


Messaggi: 137
Iscritto: 27/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 2:31
Giovedì, 23/12/2010
La classe BufferedImage ha un metodo che fa per te: getRGB(x,y);

questo metodo ti ritorna il colore del pixel x,y.

A questo punto quello che devi fare è semplicemente prendere il colore pixel per pixel e disegnare una serie di 0 e 1 con quei colori.

PM
Avatar
crashoverride (Ex-Member)
Rookie


Messaggi: 39
Iscritto: 12/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 10:20
Giovedì, 23/12/2010
Ok, grazie! Ci provo ;)

Mentre per il nome delle classi va bene? Tu come chiami la classe contenente la GUI? Io non sono mai sicuro... :(

:D

Grazie ancora!

PM
Avatar
crashoverride (Ex-Member)
Rookie


Messaggi: 39
Iscritto: 12/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 12:13
Giovedì, 23/12/2010
Ci sono quasi riuscito!
Questo è il codice della classe JImageToText.java
Codice sorgente - presumibilmente Java

  1. import java.awt.Color;
  2. import java.awt.Graphics2D;
  3. import java.awt.image.*;
  4.  
  5. public class JImageToText {
  6.        
  7.         public static BufferedImage imgToText(BufferedImage image){
  8.  
  9.                 int w = image.getWidth();
  10.                 int h = image.getHeight();
  11.                 int rgb = 0;
  12.                
  13.                 BufferedImage newImage = new BufferedImage(w,h,image.getType());
  14.                
  15.                 Graphics2D g = newImage.createGraphics();
  16.                 g.setColor(new Color(image.getRGB(0,0)));
  17.                 g.fillRect(0,0,w,h);
  18.  
  19.                 int n = 0;
  20.                
  21.                 for (int y = 0; y<h;y+=10){
  22.                         for (int x = 0; x<w; x+=10){
  23.                                 rgb = image.getRGB(x, y);
  24.                                 g.setColor(new Color(rgb));
  25.                                
  26.                                 if (n==0) {
  27.                                         g.drawString("1", x, y);
  28.                                         n++;
  29.                                 }
  30.                                 else {
  31.                                         g.drawString("0", x, y);
  32.                                         n--;
  33.                                 }
  34.                         }
  35.                 }
  36.                 return newImage;
  37.         }
  38. }



Ora vi spiego il problema...
Allora prima di tutto non riesco a fare in modo che quando creo  l'immagine newImage il suo sfondo sia invisibile e quindi venga riempito dagli 1/0 allora ho messo che come sfondo ha il colore del pixel in posizione 0,0.
Questo primo problema non è neanche molto grave...


Mentre l'altro problema che è un po' più grave è che per ogni immagine bisogna modificare la frequenza di pixel saltati nei cicli for (scusate ma non sò come spiegarlo meglio, comunque intendo x+=10 e y+=10) perchè in base alla grandezza e tipo di immagine vanno modificati come faccio a trovarne uno che vada bene per tutti o comunque a calcolare quale vada bene per ogni immagine? :)

Avete delle soluzioni? Grazie mille! :)


Ultima modifica effettuata da crashoverride il 23/12/2010 alle 13:30
PM