Oppure

Loading
22/12/10 20:48
crashoverride
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
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.image.*;

public class ImageToTextGUI {
	private JFrame f;
	private JPanel p;
	private JLabel image;
	
	ImageToTextGUI(){
		f = new JFrame("Image2Text");
		BufferedImage bi = JImageLoader.loadImage("/Users/nicolagheza/Desktop/immagine.jpg");
		BufferedImage icon = JImageLoader.getImageIcon(bi);
		ImageIcon imageIcon = new ImageIcon(icon);
		image = new JLabel();
		image.setIcon(imageIcon);
		f.add(image, BorderLayout.CENTER);
		f.pack();
		f.setVisible(true);
	}
	
	public static void main(String args[]){
		new ImageToTextGUI();
	}
}


Classe JImageLoader
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.*;
import javax.swing.*;

public class JImageLoader{
	
	/**
	 * This method allows to load an Image.
	 * @param url It's the path of the image.
	 * @return It return a BufferedImage object contains the Image we want to add. 
	 */
	
	public static BufferedImage loadImage(String url){
		BufferedImage loaded = null;
		try {
			loaded = ImageIO.read(new File(url));
		}catch(IOException e){
			e.printStackTrace();
		}
		return loaded;
	}
	

	public static BufferedImage getImageIcon(BufferedImage bufferedImage){
		
		int newW = 100;
		int newH = 100;
		int h = bufferedImage.getHeight();
		int w = bufferedImage.getWidth();
		BufferedImage bi = new BufferedImage(newW, newH, bufferedImage.getType());

		Graphics2D g = bi.createGraphics();
		
		g.drawImage(bufferedImage, 0, 0, newW, newH, 0, 0, w, h, null); 
		g.dispose();
		return bi;
	}
	
}


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:

Ultima modifica effettuata da crashoverride 22/12/10 21:38
aaa
23/12/10 1:31
paoloricciuti
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.
aaa
23/12/10 9:20
crashoverride
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!
aaa
23/12/10 11:13
crashoverride
Ci sono quasi riuscito!
Questo è il codice della classe JImageToText.java
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.*;

public class JImageToText {
	
	public static BufferedImage imgToText(BufferedImage image){

		int w = image.getWidth();
		int h = image.getHeight();
		int rgb = 0;
		
		BufferedImage newImage = new BufferedImage(w,h,image.getType());
		
		Graphics2D g = newImage.createGraphics();
		g.setColor(new Color(image.getRGB(0,0)));
		g.fillRect(0,0,w,h);

		int n = 0;
		
		for (int y = 0; y<h;y+=10){
			for (int x = 0; x<w; x+=10){
				rgb = image.getRGB(x, y);
				g.setColor(new Color(rgb));
				
				if (n==0) {
					g.drawString("1", x, y);
					n++;
				}
				else {
					g.drawString("0", x, y);
					n--;
				}
			}
		}
		return newImage;
	}
}



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 23/12/10 12:30
aaa