giovedì 15 dicembre 2005

risultato


risultato
Originally uploaded by febbrile.

#!/usr/bin/ruby
#
# PhotoCompose.rb ver.: 0.1Alfa
# @Autore: Vincenzo Visciano
#
# @Rilasciato sotto licenza 'fateci un po' quello che vi pare'
#
# descrizione: Programma per la manipolazione delle immagini.
#
# data una directory contenente immagini e una immagini di riferimento,
# crea una immagine risultante raffigurante l'immagine di riferimento
# e composta dalle immagini contenute nella directory.
#
# $ PhotoCompose.rb immagineDiPartenza.jpg 100 1024x768

require 'RMagick'
include Magick

fotoOriginale = ARGV[0]
dimensioniFotoRisultato = ARGV[2].split("x")
numeroRiquadri = ARGV[1].to_i

listaFoto = Dir["*.{jpg,JPG}"]

originale = Magick::Image.read(fotoOriginale).first
larghezzaRiquadro = originale.columns / numeroRiquadri
altezzaRiquadro = originale.rows / numeroRiquadri

larghezzaFotoRisultato = dimensioniFotoRisultato[0].to_i
altezzaFotoRisultato = dimensioniFotoRisultato[1].to_i

larghezzaRiquadroRisultato = larghezzaFotoRisultato / originale.columns * larghezzaRiquadro
altezzaRiquadroRisultato = altezzaFotoRisultato / originale.rows * altezzaRiquadro

conta = 0
print "creo miniature ..."
filesSorgenti = Array.new
miniature = Array.new
listaFoto.each { |nomefile|
filesSorgenti[conta] = Magick::Image.read(nomefile).first
miniature[conta] = filesSorgenti[conta].resize(larghezzaRiquadro, altezzaRiquadro, LanczosFilter, 0.8)
filesSorgenti[conta].resize!(larghezzaRiquadroRisultato, altezzaRiquadroRisultato)
conta += 1
}
print " fatto!\n\r"

print "Compongo immagine risultato ..."
nuovaImmagine = Magick::Image.new(larghezzaFotoRisultato, altezzaFotoRisultato)
sostituto = Magick::Image.new(larghezzaRiquadroRisultato, altezzaRiquadroRisultato)

riga = colonna = 0
(numeroRiquadri*numeroRiquadri).times do
riquadro = originale.crop(0+(colonna*larghezzaRiquadro),0+(riga*altezzaRiquadro), larghezzaRiquadro, altezzaRiquadro)
differenza = [nil, nil, nil]
conta = 0
miniature.each { |miniatura|
diff = riquadro.difference(miniatura)
if (differenza[0] == nil) || (diff[0] < differenza[0])
sostituto = filesSorgenti[conta]
differenza = diff
end
conta += 1
}
nuovaImmagine.composite!(sostituto, 0+(colonna*larghezzaRiquadroRisultato), 0+(riga*altezzaRiquadroRisultato), ReplaceCompositeOp)
if colonna == numeroRiquadri-1
colonna = 0
riga += 1
else
colonna += 1
end
end
nuovaImmagine.write("risultato.jpg")
print " fatto!\n\r"
nuovaImmagine.display
exit

9 commenti:

bubusea ha detto...

...ma sei fòra????

il fravecatore ha detto...

in che senso scusa!?!? :-P

pigliapost ha detto...

Che emozione, la prima volta che leggo un codice rilasciato dal Becienzo!

E bbbravo!

Se solo sapessi che guarda caso proprio in questi giorni cercavo una cosa equivalente!

il fravecatore ha detto...

oi pigliapost, da quanto tempo non avevo tue notizie...

questo è il mio primo esperimento con questo merabiglioso linguaggio che è Ruby, il codice va un po' ottimizzato e appena ho un po' di tempo lo faccio.
Voglio prevedere che se tra due foto la somiglianza è piccola deve scartare quella che ha già utilizzato e cose di questo genere.

se vi serve una mano a farlo funzionare contattatemi pure...

pintaycolorea ha detto...

e come si usa sta cosa?, voglio dire...dove la scrivoooo??

Freeariello ha detto...

Azz... ma allora sei un programmatore d''a capa 'o pere!...
Neanche il tempo di darti l'idea :-)
L'unica cosa è che le foto che compongono l'immagine grande sono troppo piccole e non si distingue cosa raffigurano... almeno nell'immagine che hai postato

checiap ha detto...

uh che bello!!

ma lo voglio usare pure io!! come faccio??

bubusea ha detto...

"fòra"..nel senso che, come già sottolineato da pintaycolorea, noi ignoranti della programmazione che ci facciamo con questo codice matrix????? Dove lo copiamo?Che viene fuori? come ci giochiamo????etc...etc..

il fravecatore ha detto...

Ciao a tutti,
ho visto che per far funzionare su windows il programmino bisogna installare un po' di cose e il procedimento non è immediato.
Il testo che trovate nel post deve essere scritto in un comune file di testo e salvato con il nomeCheViPare ma avete bisogno di installare l'interprete ruby (per mac, per windows)
Non metto le istruzioni per linux perchèp quelli che usano linux ne ne dovrebbero avere bisogno... :-P

poi andrebbero installate anche le librerie RMagick, le trovate qui... (per windows, per mac, ma per installarle avete bisogno di rubygem

allora facciamo così, io comunque devo fare delle modifiche... lo riscirvo e lo faccio in modo che dibbiate scaricare un solo file e poi eseguirlo... ;-)

ps ci sarà da aspettare un po' di tempo libero...