Sarà capitato a tutti: il telefonino si rifiuta improvvisamente di installare una nuova app o di aggiornarsi, memoria insufficiente. La colpa principale? Troppe foto, su Whatsapp in particolare. Abbiamo lasciato che si accumulassero, in un mucchio indistinguibile di caffè del buongiorno e istantanee della nipotina. Faremmo benissimo a meno dei primi, ma non rinunceremmo mai alle seconde, certo, ma come si fa a distinguerle?
Una soluzione c’è: un semplice backup, un po’ di reminiscenze Linux e un po’ di pazienza. Vediamo come!
Prevenire è meglio che curare
È bene sempre cominciare con un sano auto-esame: si poteva prevenire l’accumulo di foto?
Spulciando i vari articoli, qualche suggerimento gestionale si trova:
- svuotare periodicamente le chat più chiacchierone (peccato che così si butti via tutto, foto comprese);
- cancellare le immagini su base regolare, ad esempio una volta a settimana (mi dispiace, ma con la regolarità non vado molto d’accordo);
- utilizzare sul pc l’interfaccia Whatsapp web, che consente di selezionare e scaricare le immagini da conservare e cancellare quelle non desiderate (anche questa azione andrebbe fatta su base regolare).
Alla fine sono certo che ricascherei nel tralasciare i buoni consigli per finire comunque con l’avere troppe foto su Whatsapp e la memoria piena. Mi serve un altro approccio.
Il primo passo: il backup delle foto
Il primo passo consiste nel liberare il telefonino dalle foto. Per farlo basta:
- fermare l’applicazione Whatsapp (si fa dalle Impostazioni del telefonino, sezione App);
- collegare il telefonino al pc con il cavetto usb;
- sul pannello che compare automaticamente sul telefonino, autorizzare l’accesso dal pc;
- sul pc, aprire una finestra di Esplora file partendo da Questo PC e navigare fino alla cartella delle immagini (es.: Questo PC\HUAWEI P9\Memoria interna\WhatsApp\Media\WhatsApp Images);
- copiare le immagini Whatsapp in una cartella del pc;
- cancellare tutte le immagini Whatsapp dal telefonino.
Il problema delle troppe foto su Whatsapp è risolto, a questo punto. Il telefonino è meno pieno e sul pc abbiamo, in una sola cartella, tutti i buongiorno caffè e le foto che ci stanno a cuore. Se ci si accontenta di tenere tutto, basta archiviare questa cartella assegnandole un nome significativo (es.: foto-whatsapp-2019) ed eventualmente memorizzarne un backup su un disco esterno o su una scheda SD.
Se, invece, si vuole recuperare il solo album delle foto, eliminando le immagini che non vale la pena di conservare, allora, in mancanza di app già pronte, bisogna lavorare un po’ di programmazione.
È bene ricordare che questa operazione pulisce l’album, eliminando foto superflue, ma non risparmia granché di spazio sul pc, poiché i file eliminati sono generalmente di dimensioni ridotte, rispetto ai file che contengono foto.
I metadati delle immagini
Immagini e foto sono memorizzate in file con un’estensione particolare (es.: .gif, .jpg, .jpeg), insieme con i cosiddetti metadati, informazioni che descrivono alcune caratteristiche dell’immagine stessa, come ad esempio le sue dimensioni.
Se si apre un’immagine su un PC Windows 10 con l’app Foto, è possibile visualizzare alcune informazioni contenute nei metadati, mediante un click su Info sul file dal menu delle impostazioni posto in alto a destra.
Come si vede dalle Info relative a una foto scattata con il mio P9, oltre alla data dello scatto e alle dimensioni sia del file (in byte) sia dell’immagine (in pixel), sono disponibili anche informazioni sulla regolazione della fotocamera. Dalla presenza nei metadati di queste ultime informazioni si può dedurre, evidentemente, che l’immagine è una foto e non un disegno.
Peccato che Whatsapp, nell’inviare e memorizzare le foto, nel suo processo di ottimizzazione della foto conservi solo le informazioni relative alle dimensione del file e dell’immagine.
Ne segue che le informazioni disponibili per distinguere foto e disegni su Whatsapp sono solo quelle del nome del file e delle dimensioni dell’immagine.
Anche sul nome dell’immagine, però, Whatsapp non ci viene in aiuto, memorizzandole con un formato nome del tipo:
IMG-20191215-WA0008.jpg
Che ci dice che il file è di tipo immagine (IMG) memorizzata il 15 dicembre del 2019 (20191215) e che è stata l’ottava immagine (WA0008) memorizzata da Whatsapp in quel giorno sul mio telefonino. Non c’è, purtroppo, nemmeno traccia del contatto o del gruppo con cui è stata scambiata l’immagine.
La sola informazione su cui ragionare è quindi la dimensione in pixel dell’immagine. Occorre tener ben presente che l’algoritmo è necessariamente euristico, quindi prono all’errore. Per quanto si agisca sui suoi criteri, ci saranno sempre assegnazioni errate di foto come immagini e viceversa. Questi errori andranno corretti manualmente.
Come si leggono i metadati
Su Linux esiste il comando file, che fornisce, su una sola riga, una descrizione del contenuto di un file. Qualche esempio:
prompt$ file terne-primitive.csv terne-primitive.csv: ASCII text, with CRLF line terminators prompt$ file IMG-20191214-WA0008.jpg IMG-20191214-WA0008.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, progressive, precision 8, 1536x2048, frames 3
Su Windows 10, per quanto ne so, non esiste una possibilità analoga su cui basare un semplice algoritmo di selezione. Quindi, gioco forza, occorre andare su Linux e sul suo ambiente di scripting shell, come già visto in un precedente articolo sulle terne pitagoriche.
Per fortuna non occorre un pc dedicato con Linux o installare un Linux accanto a Windows, come invece era necessario fino a Windows 8. Con il 10, infatti, è possibile abilitare un nucleo di Linux (bash) all’interno di Windows 10. In rete esistono varie guide per eseguire questo semplice passaggio.
Occorre solo tener conto di due aspetti legati all’utilizzo del file system da parte del Bash su Windows 10:
- il Bash di Linux, quando parte, vede solo una particolare cartella del disco; ho preferito evitare montaggi/smontaggi di cartelle, tema su cui non sono ferrato, e quindi ho memorizzato in un collegamento sul desktop il percorso della cartella di partenza del Bash e ho creato lì la struttura di cartelle che mi serve, copiandovi i dati da elaborare;
- il Bash, quando parte, memorizza la situazione dei file e non vede eventuali modifiche effettuate successivamente da Windows; quindi, se occorre aggiungere o eliminare file da Windows, occorre terminare Bash e poi riaprirlo a modifiche concluse.
Per il resto il Bash Linux inserito in Windows 10 è di semplice e comodo utilizzo.
L’algoritmo passo per passo
Una volta copiate le immagini di Whatsapp sul PC, in una cartella accessibile al Bash, l’idea è quella di:
- creare nella cartella delle immagini altre due cartelle: foto e img;
- elaborare via script una lista in formato csv con: nome file, dimensioni in pixel, foto/img; es.:
IMG-20190421-WA0011.jpg, 708×516, img
IMG-20171230-WA0013.jpg , 898×1600, foto; - partendo dalla lista csv, spostare via script i vari file nella cartella foto o in quella img;
- verificare manualmente nella cartella img la presenza di eventuali foto, erroneamente classificate come immagini, e spostarle nella cartella foto.
L’ultimo passaggio è necessario perché, come visto più su, i criteri di riconoscimento delle foto non sono ovviamente perfetti, ci sono falsi riconoscimenti in entrambi i sensi. Il controllo comunque è ragionevolmente veloce, visualizzando le anteprime delle immagini con le icone molto grandi di Esplora file. Nel mio caso ho trovato solo 7 foto su 660 file classificati come immagini.
Il tasso di errori nell’altro senso è simile, ma il controllo è un po’ più lungo. Nel mio caso si tratta di visualizzare 2.631 anteprime, si può tollerare di tenersi qualche decina di non-foto, c’è sempre tempo per eliminarle.
Il primo passaggio: generazione del file csv
La generazione della lista dei file con la destinazione foto/img si può effettuare in una sola riga di comando, utilizzando i comandi dello shell, del linguaggio di scripting awk e l’operatore pipe (|). Quest’ultimo, inserito tra due comandi, fa sì che l’output del primo diventi l’input del secondo.
La riga di comando completa è questa:
file *.jp* | awk -F "," '{printf substr($1, 1, match($1, ":")-1) ","; for (i=1; i<= NF; ++i) if ($i !~ /[a-wyzA-Z]/ && $i ~ /[0-9]x[0-9]/) printf $i; printf "\n"}' | awk -F "," '{printf $0 ","; split($2,a,"x"); n = asort(a); if (a[2]/a[1] > 1.2 && a[1] > 599 && a[2] > 999) print "foto"; else print "img"}'> lista.csv
E va eseguita nella cartella che contiene le immagini di whatsapp. Esaminiamo la riga pezzo per pezzo.
Si parte con file *.jp* | che, tradotto, vuol dire estrai le caratteristiche di ogni file con estensione .jpg e .jpeg e passale al comando successivo.
Il comando successivo è un awk:
awk -F “,” ‘{printf substr($1, 1, match($1, “:”)-1) “,”; for (i=1; i<= NF; ++i)
if ($i !~ /[a-wyzA-Z]/ && $i ~ /[0-9]x[0-9]/) printf $i; printf “\n”}’ |
A parte la sintassi un po’ complicata, questo comando si traduce in:
- considera quello che ti arriva dal comando precedente come se fosse una riga di csv, con la virgola come separatore (-F “,”);
- stampa (printf) il primo elemento del csv dal primo carattere fino a quello che precede il carattere “:” (è il nome del file);
- stampa i campi che seguono, individuati da una virgola alla successiva, ma solo se:
- non contengono nessuna lettera dalla a alla w, la y, la z e le lettere dalla A alla Z; quindi è consentita solo la x;
- contengono la sequenza “cifra-lettera x- cifra”;
questi due filtri consentono di isolare solo i campi del tipo 1536×2048;
- termina la riga e passa ad analizzare la successiva riga (printf “\n”), passando l’output al comando successivo (|).
Foto o immagine?
Non abbiamo ancora finito, dalla dimensione, scritta come: 1536×2048, vanno estratti i due valori di altezza e larghezza dell’immagine, per elaborarli.
A questo provvede il successivo comando:
awk -F “,” ‘{printf $0 “,”; split($2,a,”x”); n = asort(a);
if (a[2]/a[1] > 1.2 && a[1] > 599 && a[2] > 999) print “foto”; else print “img”}’
Il secondo valore della coppia ereditata dal comando precedente ($2) viene elaborato estraendo i valori di altezza e larghezza, ordinandoli in senso crescente e decidendo che si tratta di una foto se:
- il rapporto tra la dimensione maggiore e quella minore è almeno pari a 1,2;
- la dimensione minore è almeno di 600 pixel;
- la dimensione maggiore è almeno di 1000 pixel.
Altrimenti il file è classificato come immagine.
L’ultimo passo è la scrittura nel file lista.csv del risultato dell’elaborazione.
È tempo di migrare
A questo punto abbiamo tutto quello che serve per spostare i file nelle cartelle foto e img.
Nota importante: verificare bene, e poi ri-verificare, di aver creato le due cartelle con i nomi corretti. In caso contrario il comando che segue cancellerà di fatto tutti i file (tranne l’ultima foto e l’ultima immagine).
Certo, avrei potuto confezionare un reale script che controllasse anche questi aspetti e non proceder a righe di comando. Ma ha vinto la pigrizia: ho accettato il rischio, sapendo che i dati in elaborazione erano una copia dei dati conservati in un’altra cartella.
Il secondo comando è:
cat lista.csv | awk -F "," '{system("mv " $1 " " $3)}'
Molto semplice, anche se potenzialmente distruttivo.
In sintesi, il comando legge una ad una le righe del file csv e le porge al successivo comando, anch’esso un awk. Quest’ultimo, a sua volta, preleva il primo campo dal csv (nome del file dell’immagine jpeg) e il terzo campo (nome della cartella in cui spostarlo) ed esegue una move (mv).
Finito. Non resta adesso che verificare e correggere gli eventuali errori di assegnazione.
Considerazioni finali
Ho provato anche a re-inserire nella cartella delle immagini Whatsapp solo i file classificati come immagini. Funziona, ovviamente l’occupazione di memoria risale, ma era giusto per verificare fino a che punto ci si può spingere. Ricordo che conviene effettuare le modifiche nelle cartelle di Whatsapp dopo averla “terminata”, cioè dopo aver fermato l’applicazione stessa. Questo previene problemi di accesso contemporaneo alla struttura dati.
Ho notato che alcuni file cancellati e non ricopiati perché considerati immagini sono riapparsi nelle conversazioni. Si tratta di 7 file recenti che, probabilmente conservati nella cache di Whatsapp, vengono rimessi in memoria al lancio dell’applicazione. Un altro punto su cui lavorare è regolare i parametri del filtro, può darsi che 600 pixel come dimensione minore di una foto sia troppo basso e che, aumentando questo valore, si correggano delle false foto senza aumentare troppo le false immagini.
Comunque, mai più troppe foto su Whatsapp!
Foto di apertura dell’articolo Gerd Altmann da Pixabay.
Mi chiamo Pasquale Petrosino, radici campane, da alcuni anni sulle rive del lago di Lecco, dopo aver lungamente vissuto a Ivrea.
Ho attraversato 40 anni di tecnologia informatica, da quando progettavo hardware maneggiando i primi microprocessori, la memoria si misurava in kByte, e Ethernet era una novità fresca fresca, fino alla comparsa ed esplosione di Internet.
Tre passioni: la Tecnologia, la Matematica per diletto e le mie tre donne: la piccola Luna, Orsella e Valentina.
Potete contattarmi scrivendo a: p.petrosino@inchiostrovirtuale.it