Programmare con Linux parte 3.
By noreply@blogger.com (Ubuntu Software Libero)
Passiamo ora ad un programma leggermente più complesso da sviluppare in Python. Lo realizziamo per applicare automaticamente un watermark, ovvero una firma, su una fotografia.
Prima di iniziare, però occorre una piccola precisazione sull’indentazione in Python.
L’indentazione sarebbe l’identificazione di porzioni di codice tramite spazi a inizio riga. Ad esempio, possiamo decidere di aggiungere due spazi all’inizio di ogni riga contenuta in un ciclo if. In questo modo si riconoscono a colpo d’occhio le righe del ciclo if da quelle ad esso esterne, perché le altre non hanno gli spazi iniziali. Su quasi tutti i linguaggi di programmazione l’indentazione è facoltativa, anche se fortemente consigliata per migliorare la leggibilità del codice. In Python, invece, no: è obbligatoria, perché è l’unico modo per distinguere le varie porzioni di codice.
Invitiamo ad analizzare il codice completo dell’esempio per una corretta visualizzazione delle indentazioni, in quanto potrebbero non essere correttamente visualizzate qui sul sito.
Cominciamo dunque con il codice del nostro esempio:
[import sys
import os
import Image]
Le prime righe sono dedicate alle librerie necessarie per il funzionamento del programma. Si tratta di normali librerie Python, presenti di default su tutte le principali distro GNU/Linux.
[def modifica(filename, watermarkname)]:
Ora, definiamo una funzione: gli attributi sono due stringhe di testo, ovvero filename e watermarkname. Si tratta dei nomi dell’immagine su cui applicare il watermark e di quello dell’immagine che costituisce il watermark stesso. Banalmente, incolleremo l’immagine watermark sopra l’altra immagine, posizionandola al centro. Ma per farlo ci servono i nomi delle due immagini.
[photo = Image.open(filename)
watermark = Image.open(watermarkname)]
Ecco quindi che all’interno della funzione apriamo le due immagini ricevute come argomento: d’ora in poi potremo accedere alle immagini utilizzando i loro oggetti di riferimento, ovvero photo per la fotografia e watermark per il watermark.
[Pwidth = photo.size[0]
Pheight = photo.size[1]
Wwidth = watermark.size[0]
Wheight = watermark.size[1]]
Memorizziamo in quattro variabili larghezza (width) e altezza (height) di entrambe le immagini. La dimensione di ogni immagine è fornita dalla sua funzione size, quindi photo.size ci dice le dimensioni dell’immagine photo. Però, la dimensione viene fornita come una “tupla”, ovvero una coppia di numeri (per l’appunto larghezza ed altezza).
[x = (Pwidth/2)-(Wwidth/2)]
[y = (Pheight/2)-(Wheight/2)]
Ora, calcoliamo la posizione in cui dovremo apporre il watermark. L’idea è semplice: se vogliamo che il watermark sia posto al centro delle foto, basta calcolare il centro della foto. Le cui coordinate sono banalmente la larghezza e l’altezza divise a metà, ovvero Pwidth/2 e Pheight/2. Però non basta: per tutte le immagini, il conteggio viene fatto dall’angolo in alto a sinistra. Quindi se utilizziamo questo semplice calcolo, il watermark si troverà con il proprio angolo alto a sinistra sul centro della fotografia, e quindi non risulterà allineato. Noi vogliamo, infatti, che il centro del watermark coincida con il centro della foto. Basta sottrarre ai numeri calcolati per il centro della foto, i valori che possiamo calcolare per il centro del watermark (larghezza e altezza del watermark divise a metà).
[photo.paste(watermark, (x, y), watermark)]
Ora possiamo incollare l’immagine watermark sopra l’immagine photo. La posizione è quella indicata dalla tupla (x,y), ovvero la coppia di coordinate che abbiamo calcolato.
[photo.save(filename.split(“.”)[0]+”_watermark.jpg”)]
Dobbiamo poi salvare l’immagine così prodotta, che è contenuta nell’oggetto photo. La funzione save richiede come argomento il nome del file su cui vogliamo salvare l’immagine: possiamo ricavarlo dal nome originale della fotografia. Il nome originale è contenuto nella variabile filename, ma questo nome contiene anche l’estensione del file (per esempio .jpg). Noi vogliamo rimuoverla, quindi dividiamo il filename con la funzione split prelevando tutto ciò che si trova a sinistra (0) del punto. Estratto soltanto il nome, aggiungiamo con l’operatore più la scritta “_watermark.jpg”. Quindi, se la fotografia originale si chiamava foto.jpg ora la versione modificata si chiamerà foto_watermark.jpg.
[if len(sys.argv) < 3:
print “Esempio d’uso: python watermark.py foto.jpg watermark.png”
sys.exit()]
La funzione è terminata: cominciamo a scrivere il codice principale. Dobbiamo prima di tutto verificare che al programma siano stati forniti gli argomenti necessari: ci servono il nome della fotografia e quello del watermark. Abbiamo bisogno di avere almeno 3 argomenti: il primo è sempre il nome stesso del programma, il secondo e il terzo possono essere ciò che vogliamo (i nomi delle due immagini). Gli argomenti sono inseriti in un “array”, ovvero un elenco di variabili (stringhe di testo nel nostro caso), chiamato sys.argv. Se i suoi elementi sono meno di 3, il programma è stato lanciato in modo errato e quindi facciamo apparire sul terminale un messaggio con il comando print per spiegare come funziona il nostro programma. Naturalmente, poi il programma deve terminare con sys.exit() perché non è in grado di funzionare correttamente.
Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!
Hai dubbi o problemi? Ti aiutiamo noi!
Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.