Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è
La PNY GeForce RTX 5080 Slim OC si distingue nel panorama delle GPU di fascia alta per il design compatto a due slot, ispirato alla NVIDIA GeForce RTX 5080 Founders Edition. In questo test analizziamo comportamento termico e prestazioni in gioco, valutando se il formato ridotto comprometta o meno l'esperienza complessiva rispetto alle soluzioni più ingombranti presenti sul mercato.
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-10-2006, 15:48   #1
Crush
Senior Member
 
L'Avatar di Crush
 
Iscritto dal: Jul 2002
Città: Novara
Messaggi: 1267
AIUTO Java: passare da una matrice di 0 e 1 a una serie di pixel colorati?!?

Ciao a tutti, la mia è domanda è tanto semplice quanto complessa da realizzare per me, visto che manco so creare una finestra in java (fin'ora ho fatto tutto sempre in dos!)

Allora, al momento possiedo una matrice di 1 e 0 e praticamente dovrei, invece che stamparla su schermo o su file txt, cosa che ho fatto, mandarla in output su una finestra in questo modo: tutti gli uno devono diventare pixel bianchi (o cmq non neri) e tutti gli zero devono essere dei pixel neri...
il max ch son riuscito a fare è scrivere la matrice su file txt, aprire word, sostituire 1 e 0 con pallini bianchi e neri e il tutto esce così



è simile a ciò che devo ottenere, ma a me serve proprio un'immagine creata pixel per pixel bianchi e neri.... e non so assolutamente come fare!!

Help please!
Crush è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 16:43   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Crush
ma a me serve proprio un'immagine creata pixel per pixel bianchi e neri.... e non so assolutamente come fare!!
Ok, prova questo codice:
Codice:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class ImageTestFrame extends JFrame
{
    public ImageTestFrame ()
    {
        super ("Image Test Frame");

        int width = 100;
        int height = 100;

        int[] pixels = new int [width * height];

        for (int y = 0; y < height; y++)
        {
            for (int x = 0; x < width; x++)
            {
                pixels[y*width+x] = y % 3 == 0 ? 0xFFFF0000 /*rosso*/ : 0xFF00FF00 /*verde*/;
            }
        }

        MemoryImageSource source = new MemoryImageSource (width, height, pixels, 0, width);

        Toolkit toolkit = Toolkit.getDefaultToolkit ();
        Image img = toolkit.createImage (source);
        ImageIcon imgIcon = new ImageIcon (img);

        JLabel label = new JLabel (imgIcon);

        add (label);

        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        pack ();
    }

    public static void main (String[] args)
    {
        SwingUtilities.invokeLater (new Runnable ()
        {
            public void run ()
            {
                ImageTestFrame f = new ImageTestFrame ();
                f.setVisible (true);
            }
        });
    }
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 16:58   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Tranquillo è facilissimo.

Un'immagine "standard" è un java.awt.image.BufferedImage. BufferedImage ha un costruttore che ti permette di stabilire quanto l'immagine debba essere grande, in pixel.

BufferedImage immagineVuota = new BufferedImage(larghezza, altezza, ...);

Il terzo parametro è un valore costante che specifica il "tipo" di immagine. Il tipo di immagine è il tipo di rappresentazione dei suoi pixel. Ad esempio, il tipo BufferedImage.TYPE_INT_ARGB usa 32 bit per ogni pixel, 4 canali, 8 bit per canale (32-24 per la trasparenza, 24-16 per il componente rosso, 16-8 per il verde e 8-0 per il blu).

Il tipo predetto è eccessivo rispetto alle tue necessità – a te basta un bit per pixel – ma è pienamente compatibile. Proviamo con questo.

BufferedImage immagineVuota = new BufferedImage(larghezza, altezza, BufferedImage.TYPE_INT_ARGB);

Tu hai una matrice di valori, quindi sei in grado di sapere il valore conservato nella riga R e colonna C.

Il che praticamente è tutto quello che ti serve. BufferedImage dispone di un metodo ad-hoc per impostare in scioltezza il valore di un pixel esattamente come se l'immagine fosse una matrice di pixel (a dire il vero è una matrice di pixel ). Il metodo in questione è:

setRGB(int colonna, int riga, int coloreDelPixel);

Il colore del pixel richiesto dal metodo setRGB è in formato ARGB a 32 bit: la stessa forma di rappresentazione del tipo INT_ARGB su citato. Se l'immagine ha un tipo di pixel diverso da INT_ARGB il colore subisce una conversione prima dell'applicazione all'immagine. Noi abbiamo abbondato, quindi la questione non ci preoccupa.

Dato il BufferedImage immagineVuota, se io volessi "colorare" di bianco il primo pixel in alto a sinistra direi semplicemente:

immagineVuota.setRGB(0, 0, Color.WHITE.getRGB());

Il metodo getRGB() degli oggetti Color restituisce il valore che rappresenta quel dato colore in formato – ancora lui – ARGB a 32 bit. Color.WHITE è il colore bianco. Color.BLACK è nero, Color.BLACK.getRGB() è il valore intero int del nero in formato ARGB 32 bit. Dunque gli enunciati:

immagineVuota.setRGB(0, 0, Color.WHITE.getRGB());
immagineVuota.setRGB(1, 0, Color.BLACK.getRGB());

colorano di bianco il primo pixel in alto a sinistra e di nero il secondo – a partire da sinistra – pixel della prima riga in alto.

Per proiettare un BufferedImage in una finestra ci sono molte vie. Una semplicissima prende l'immagine (per noi immagineVuota), la incapsula in un oggetto di tipo ImageIcon e rifila quell'ImageIcon ad un'etichetta (JLabel). Poi metti l'etichetta in un contenitore (o direttamente nel contenitore principale di una finestra) e infine apri quella finestra sullo schermo.

Esempio condensato:

Codice:
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class Immagina {

	public static void main(String[] args) {
		/* questo serve solo per avere una generica "matrice" come
		punto di partenza */
		Matrice matrice = new Matrice(100, 100);
		for(int i = 0; i < matrice.getNumeroRighe(); i++) {
			for(int j = 0; j < matrice.getNumeroColonne(); j++) {
				matrice.set(i, j, i % 2);
			}
		}
		/* a partire da una matrice di valori... */
		int larghezza = matrice.getNumeroColonne();
		int altezza = matrice.getNumeroRighe();
		int tipo = BufferedImage.TYPE_INT_ARGB;
		BufferedImage immagine = new BufferedImage(larghezza, altezza, tipo);
		for(int i = 0; i < immagine.getWidth(); i++) {
			for(int j = 0; j < immagine.getHeight(); j++) {
				int valoreMatrice = matrice.get(j, i); //righe = altezza, colonne = larghezza
				/* bianco se il valore è 1, nero se il valore è 0 */
				int colorePixel = 
					valoreMatrice == 1 ? Color.WHITE.getRGB() : Color.BLACK.getRGB();
				/* colora di "colorePixel" il pixel della riga i e colonna j */
				immagine.setRGB(i, j, colorePixel);
			}
		}
		proiettaImmagine(immagine);
	}
	
	private static void proiettaImmagine(final Image immagine) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Icon icona = new ImageIcon(immagine);
				JLabel etichetta = new JLabel(icona);
				JFrame finestra = new JFrame("Immagina");
				finestra.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
				finestra.add(etichetta, BorderLayout.CENTER);
				finestra.pack();
				finestra.setVisible(true);
			}
		});
	}
}

class Matrice {
	private int[] dati;
	private int numeroRighe, numeroColonne;
	
	public Matrice(int numeroRighe, int numeroColonne) {
		dati = new int[numeroRighe * numeroColonne];
		this.numeroRighe = numeroRighe;
		this.numeroColonne = numeroColonne;
	}
	
	public int get(int riga, int colonna) {
		return dati[riga * numeroColonne + colonna];
	}
	
	public void set(int riga, int colonna, int valore) {
		dati[riga * numeroColonne + colonna] = valore;
	}
	
	public int getNumeroRighe() {
		return numeroRighe;
	}
	
	public int getNumeroColonne() {
		return numeroColonne;
	}
}
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 17:02   #4
Crush
Senior Member
 
L'Avatar di Crush
 
Iscritto dal: Jul 2002
Città: Novara
Messaggi: 1267
beh per fare qualcosa la fa ma potresti commentarmelo brevemente così lo capisco e tento di implementarlo nel mio programma?

grazie mille comunque!

EDIT: mi riferivo alla prima reply, la seconda manco l'avevo vista (post in contemporanea) mo leggo!

Ultima modifica di Crush : 25-10-2006 alle 17:26.
Crush è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 17:50   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da Crush
beh per fare qualcosa la fa ma potresti commentarmelo brevemente così lo capisco e tento di implementarlo nel mio programma?
Guarda ... il mio esempio è molto semplice.

Innanzitutto si usa un array di int, in cui ogni cella contiene il colore di 1 pixel. Sui 32 bit del valore int, il colore è codificato così:

bit 31-24 = alpha (0=trasparente .... 255=opaco)
bit 23-16 = rosso
bit 15-8 = verde
bit 7-0 = blu

Una volta che l'array è stato riempito, si crea un MemoryImageSource, che non è l'immagine ma è il "produttore" della immagine. A quel punto si usa il Toolkit della AWT per creare una Image.

Nel mio esempio ho voluto mettere l'immagine dentro una JLabel, che però si aspetta un ImageIcon, quindi ho dovuto fare un passo in più. In generale basta avere un Image, per esempio se si vuole stampare su un Graphics.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 18:46   #6
Crush
Senior Member
 
L'Avatar di Crush
 
Iscritto dal: Jul 2002
Città: Novara
Messaggi: 1267
hummm sembra che ci sia riuscito con qualche dritta di PGI-Bis
adesso 2 domande veloci che non si sa mai:
1) c'è un modo per zoommare il tutto rendendolo bello pixelloso?
2) ma in java gli exe non esistono vero? se volessi creare na roba eseguibile devo fare un'applet?

cmq grazie siete dei Santi
Crush è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 20:52   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Exe.
La piattaforma Java funziona come un sistema operativo virtuale. Windows ha gli exe, Linux non ha un'estensione che indica un file come eseguibile, la piattaforma Java ha i "jar eseguibili". Un jar è un archivio zip con estensione jar che contiene i file binari (bytecode) dell'applicazione java, le risorse e compagnia bella, e un file di nome:

META-INF/MANIFEST.MF

Il file META-INF/MANIFEST.MF è un file di testo ASCII che contiene alcuni valori ma, in l'unico necessario ai fini dell'eseguibilità, è il nome pienamente qualificato della classe che dichiara il punto d'entrata dell'applicazione (un metodo tradotto in bytecode la cui firma sia public static void main(String[] args) o public static void main(String... args), insomma il metodo "main").
Pixellosità.

Dunque tu pigli i tuoi file sorgenti e li compili avendo cura che il compilatore generi l'albero di cartelle corrispondenti ai package delle varie classi. Poi metti i file class, con le loro cartelle (se la classe appartiene al package it.bongo avrai una cartella it/ che contiene una cartella bongo/ che contiene il file class, tu zippi la cartella it/) in uno zip, nome a piacimento. Poi metti nello zip una cartella di nome META-INF e dentro a quella cartella piazzi un file di nome MANIFEST.MF che contiene due linee di testo. La prima nella forma:

Main-Class: nomePienamenteQualificatoDellaClasseCheContieneIlMetodoMain

e la seconda la lasci vuota. Se non termina con una linea vuota va tutto a schifìo.

Infine rinomini il file zip affinchè termini estensione jar e ha il tuo eseguibile per la piattaforma Java. In realtà lo stesso zip è pronto per essere eseguito ma il possesso di un'estensione tipica aiuta ad associare l'archivio con il programma che lancia la macchina virtuale Java.

Anzichè fare tutta 'sta manfrina puoi usare il comando "jar" che crea l'archivio zip con estensione jar e tutto quello che gli va dietro. La documentazione del programma "jar" è contenuta nella documentazione standard della piattaforma Java SE.

Pixellosità.
Potresti creare un'immagine grande il doppio e anzichè fare una corrispondenza 1:1 tra i valori della matrice e i valori dei pixel farla 1:2. La cosa dovrebbe corrispondere ad un ingrandimento "nearest neighbor" ma non sono sicurissimo. Se così fosse basterebbe applicare un filtro al tuo BufferedImage. Riporto l'esempio di prima modificato in modo tale da rendere un'immagine ingrandita di 4 volte:

Codice:
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import javax.swing.*;

public class Immagina {

	public static void main(String[] args) {
		/* questo serve solo per avere una generica "matrice" come
		punto di partenza */
		Matrice matrice = new Matrice(100, 100);
		for(int i = 0; i < matrice.getNumeroRighe(); i++) {
			for(int j = 0; j < matrice.getNumeroColonne(); j++) {
				matrice.set(i, j, i % 2);
			}
		}
		/* a partire da una matrice di valori... */
		int larghezza = matrice.getNumeroColonne();
		int altezza = matrice.getNumeroRighe();
		int tipo = BufferedImage.TYPE_INT_ARGB;
		BufferedImage immagine = new BufferedImage(larghezza, altezza, tipo);
		for(int i = 0; i < immagine.getWidth(); i++) {
			for(int j = 0; j < immagine.getHeight(); j++) {
				int valoreMatrice = matrice.get(j, i); //righe = altezza, colonne = larghezza
				/* bianco se il valore è 1, nero se il valore è 0 */
				int colorePixel = 
					valoreMatrice == 1 ? Color.WHITE.getRGB() : Color.BLACK.getRGB();
				/* colora di "colorePixel" il pixel della riga i e colonna j */
				immagine.setRGB(i, j, colorePixel);
			}
		}
		/* anzichè proiettare l'immagine "originale" ne proietto
		un'altra, ingrandimento della prima */
		BufferedImage ingrandita = ingrandisci(immagine, 4);
		proiettaImmagine(ingrandita);
	}
	
	private static BufferedImage ingrandisci(BufferedImage originale, float fattoreIngrandimento) {
		/* Ingrandimento 4x, orizzontale e verticale */
		AffineTransform ingrandimento =
			AffineTransform.getScaleInstance(fattoreIngrandimento, fattoreIngrandimento);
		/* Crea un trasformatore di BufferedImage che applica la trasformazione
		affine "ingrandimento" */
		BufferedImageOp op = new AffineTransformOp(ingrandimento, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
		/* il "null" significa "crea l'immagine di destinazione" */
		BufferedImage risultato = op.filter(originale, null);
		return risultato;
	}
	
	private static void proiettaImmagine(final Image immagine) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				Icon icona = new ImageIcon(immagine);
				JLabel etichetta = new JLabel(icona);
				/* stavolta infilo l'etichetta in un pannello con delle
				barre di scorrimento perchè l'immagine potrebbe essere un po'
				troppo grande per lo schermo dell'utente */
				JScrollPane contenitoreEtichetta = new JScrollPane(etichetta);
				contenitoreEtichetta.setPreferredSize(new Dimension(400, 400));
				JFrame finestra = new JFrame("Immagina");
				finestra.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
				finestra.add(contenitoreEtichetta, BorderLayout.CENTER);
				finestra.pack();
				finestra.setVisible(true);
			}
		});
	}
}

class Matrice {
	private int[] dati;
	private int numeroRighe, numeroColonne;
	
	public Matrice(int numeroRighe, int numeroColonne) {
		dati = new int[numeroRighe * numeroColonne];
		this.numeroRighe = numeroRighe;
		this.numeroColonne = numeroColonne;
	}
	
	public int get(int riga, int colonna) {
		return dati[riga * numeroColonne + colonna];
	}
	
	public void set(int riga, int colonna, int valore) {
		dati[riga * numeroColonne + colonna] = valore;
	}
	
	public int getNumeroRighe() {
		return numeroRighe;
	}
	
	public int getNumeroColonne() {
		return numeroColonne;
	}
}
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 23:10   #8
Crush
Senior Member
 
L'Avatar di Crush
 
Iscritto dal: Jul 2002
Città: Novara
Messaggi: 1267
ma perchè far tutto quello sbattimento se c'è il creatore automatico?

ho provato e lo crea, solo che non so che farci col jar... magari va sul nokiotto
con windows non so con cosa aprirlo
Crush è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 23:19   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da Crush
ma perchè far tutto quello sbattimento se c'è il creatore automatico?

ho provato e lo crea, solo che non so che farci col jar... magari va sul nokiotto
con windows non so con cosa aprirlo
Così, tanto per sapere perchè le cose funzionano.

In windows i jar sono associati all'applicazione javaw.exe che è come java.exe solo che non c'è una "console". Se la tua applicazione è a linea di comando devi lanciare l'applicazione da linea di comando. Se l'applicazione è impacchettata in un jar eseguibile, dal prompt dei comandi:

java -jar NomePacchetto.jar
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2006, 23:43   #10
Crush
Senior Member
 
L'Avatar di Crush
 
Iscritto dal: Jul 2002
Città: Novara
Messaggi: 1267
humm io ce l'ho associato a winrar
se provo ad associarlo con javaw me lo apre con quella cacca di ltsa che per ora devo tenere sul pc perchè mi serve... cmq vabè, in pratica su windows si fa prima a farlo partire da dos tramite il solito "java nomeprogramma"
Crush è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
I Meta Ray-Ban Display potrebbero non ar...
La serie di God of War ha trovato l'attr...
Il nuovo iPhone Fold si farà atte...
Ex CEO di Intel furioso verso Wall Stree...
Un foglietto di rame e le prestazioni di...
100 agenti AI per dipendente: quello che...
Le 10 migliori offerte del weekend Amazo...
75'' e 85'' QD-Mini LED: 2 TV interessan...
Offerte Amazon sui componenti hardware P...
iOS 27 porterà tante novità...
Tutte le migliori offerte sui robot aspi...
Attenti ai Samsung 990 Pro contraffatti,...
2 prezzi eccezionali: scope elettriche l...
Crimson Desert arriva anche su Switch 2?...
2 iPhone in offerta su Amazon: il 17 256...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:34.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v