Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Riccardo Ferrari - Ottobre 10, 2017, 06:25:49 am

Titolo: ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 10, 2017, 06:25:49 am
Non so sia corretto scrivere qui, nel forum generale, anziche' in quello dedicato alla grafica. In quel forum pero' c'e' un solo thread del 2017 (giugno), cinque del 2016, uno del 2015 e cosi' via. Temo che non sia seguito. Quindi vengo al merito.
Ho scritto un programma che funziona appoggiandosi brutalmente (quanto vergognosamente) ad un programma esterno lanciato con Process.Execute. Il programma in questione e' Convert.Exe parte del famosissimo ImageMagick, peraltro contenuto come unit nelle distribuzioni di FreePascal come PascalMagick.
Ho pensato quindi di eliminare il lancio esterno integrando le unit. Non sono riuscito: ImageMagick funziona con alcune DLL che sono irreperibili di per se' (sul web molti le propongono, ma cliccando si finisce nei soliti siti trabocchetto e/o truffa) occorre scaricare (legalmente gratis) il pacchetto ImageMagick compilato dynamic (non quello portable che in genere preferisco) installarlo (non basta estrarlo), andare a cercare le DLL e copiarsele.
Vabbe' … ci sei riuscito, direte. No perche' uso un sistema a 64 bit ma compilo a 32 per usare i programmi dappertutto. Le DLL a 32 bit di ImageMagick non funzionano sui sistemi a 64 bit, perche' ImageMagick pretende la registrazione delle DLL (installando il programma o a mano con RegSvr32) e i 64 bit non registrano le DLL a 32. Alla fine sono riuscito a far funzionare un programma di prova (ridimensionamento di un'immagine) ma con una procedura improponibile per un lavoro effettivo: scrivo il programma sul PC che uso abitualmente (64 bit), lo compilo, poi copio l'EXE (che sul 64 esce con l'errore di DLL non registrata) su una chiavetta USB e lo faccio girare su un PC a 32 bit sul quale avevo registrato le DLL di ImageMagick. Funziona. Cioe' funziona la prova. Non funzionerebbe in un uso effettivo perche' devo usare il solito programma sia sui 64 che sui 32 bit.
Dovrei compilare una versione a 64 (ammesso che riesca ad installare correttamente le DLL a 64 bit, non ho ancora provato) e una versione a 32. Per esperienza so che quando ti serve hai sempre a disposizione il programma sbagliato: sei a 32 ma hai quello a 64 e viceversa. Per cui tendo (cioe' voglio) unificare.
Non capisco la gestione cosi' inutilmente complessa delle DLL da parte di ImageMagick. Le poche volte che ho usato le DLL e' stato sufficiente copiarle nella solita directory dell'EXE.
Domanda: come se ne esce?
Saluti
Riccardo
Titolo: Re:ImageMagick
Inserito da: xinyiman - Ottobre 10, 2017, 08:24:27 am
Ciao Riccardo, io in questi casi preferisco lanciare l'eseguibile esterno, anche perchè mi permette di avere un certo grado di astrazione. Per intenderci, se domani trovi un exe che fa al caso tuo migliore di ImageMagick con molta semplicità lo sostituisci e tutto continua a funzionare. A volte bisogna barattare la pulizia di codice con la flessibilità. Se vuoi il mio consiglio lascia stare le dll e lancialo come facevi con il TProcess.
Titolo: Re:ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 11, 2017, 04:38:26 am
Se vuoi il mio consiglio lascia stare le dll e lancialo come facevi con il TProcess.
Apprezzo con sorpresa la risposta. Pensavo che lanciare programmi esterni fosse deprecabile, una cosa da lamer. Una volta si diceva "lamer", ma e' una parola che non sento da un po'.
Per di più quando del solito programma esistono le DLL gratuite.
Ero anche preoccupato per la velocita'. Immagino che lanciare un programma esterno sia molto piu' lento. O mi sbaglio anche qui?
Grazie per l'attenzione.
Saluti.
Riccardo.
Titolo: Re:ImageMagick
Inserito da: xinyiman - Ottobre 11, 2017, 08:15:54 am
Buongiorno, bhe lamer si usa per altre cose e non perchè si richiama un programma esterno al proprio. Sulla velocità dipende molto quante volte richiami il programma esterno. Ovvero se lo richiami 10000 volte perchè all'interno di un for devi calcolare la latenza dettata dal lancio. Diversamente se lo usi in maniera oculata una volta sola o poche volte l'utente non si rende conto della differenza.
Titolo: Re:ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 11, 2017, 09:25:14 am
Ho gia' scritto la risposta ma aggiungo *in testa* questa riga per sottolineare che ti ringrazio per l'attenzione e non voglio essere polemico. Aggiungo in testa perche' rileggendo il mio post poteva sembrare tale. Niente di tutto questo.
Fine dell'aggiunta.
Lamer da Wikipedia: "non hanno conoscenze informatiche molto profonde, e arrivano ai loro scopi usando programmi fatti da altri seguendo guide che circolano per il web". Essendo un autodidatta informatico (Lamer era riferito a me stesso) non posso avere che conoscenze limitate: a lanciare un EXE sono capaci tutti mentre un po' meno sono capaci a implementare le API di una DLL. E infatti non ci sono riuscito. Cioe' ci sono riuscito, ma ... (a chi interessa puo' leggere il primo post del thread).
Due precisazioni
1) Di "utenti" non ce sono molti, praticamente scrivo i programmi per me stesso e pochi altri. Per la maggior parte sono l'unico utente. Alcuni miei programmi sono usati da cinque/sei persone. E non sono certi i programmi fondamentali del loro lavoro. Per esempio, con piacevole sorpresa, ho scoperto che un collega di lavoro di vent'anni fa usa in DosBox una mia rubrica telefonica scritta in TurboPascal! Quando ha cambiato ufficio si e' copiato i file del PC che usava e dentro c'era anche quello. Dice per via dei numeri di telefono. Il programma aveva anche una funzione di aggiunta dei numeri per cui ha continuato ad aggiornare il mio vecchio database.
2) Velocita': purtroppo e' cio' che accade, devo scalare molte immagini (per ora circa 1.500) e quindi chiamo 1.500 volte convert.exe. Pensavo che con le DLL la differenza di velocita' si sarebbe sentita. Faro' una prova. In una prima bozza per trattare le 1.500 immagini Jpeg (scala e aggiunge una scritta) ha impiegato un'enormita': quasi un'ora. Poi ho cambiato un parametro alla linea di comando di convert.exe (nulla di cambiato nel mio codice) e il tempo di esecuzione e' passato a circa sette/otto minuti. Chissa' cos'ho fatto.
In merito al lancio degli EXE ho scritto una bozza (devo finirla) che estrae da un PDF la data di ultima modifica e la assegna al file: quando ti arrivano per email prendono la data dell'email, ma possono essere stati scritti mesi prima, se non anni.
Dopo aver provato inutilmente parecchie unit per la lettura dei PDF, che funzionano su alcuni ma non su altri (benche' non mi interessi il contenuto ma solo le info) sono giunto (purtroppo) alla conclusione che la strada migliore sia quella di lanciare Pdfinfo, parte di xpdf recentemente evocato qui
Esistono programmi da riga di comando che piu' o meno lo fanno.
pdftotext.exe per dirne uno (https://en.wikipedia.org/wiki/Pdftotext (https://en.wikipedia.org/wiki/Pdftotext)).
e poi leggere l'output.
Saluti.
Riccardo.
Titolo: Re:ImageMagick
Inserito da: xinyiman - Ottobre 11, 2017, 10:22:31 am
Sei liberissimo di pensarla così. Ti dico solo che concettualmente lanciare una dll è come lanciare un programma esterno. Perchè non è codice tuo, e oltre tutto è un codice chiuso a cui non hai accesso. Se devi solo ridimensionare aspetta che questa sera arrivo a casa e ti allego io una libreria che ti permette di ridimensionare con codice free pascal.
Titolo: Re:ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 11, 2017, 05:39:42 pm
ti allego io una libreria che ti permette di ridimensionare con codice free pascal.
Grazie, la guardero' volentieri. Comunque non devo solo ridimensionare, questa e' la linea di comando che passo a convert.exe di ImageMagik:
.
<inizia>
convert -background transparent -fill <C> -gravity center -size <H1xV1> caption:<S> <F2> +swap -gravity south -composite -resize <H2xV2> -quality <Q> -density <D> <F2>
<finisce>
.
Il testo da inserire sull'immagine ha i seguenti parametri <inseriti tra le parentesi angolate>
.
<C> = Colore RGB dell'inserimento
<H1xV1> = Larghezza x Altezza (del testo)
<S> = Stringa del testo da inserire
.
L'immagine ha i seguenti parametri <idem>
.
<F1> = File immagine da elaborare
<H2xV2> = Larghezza x Altezza (dell'immagine risultato)
<F2> = File immagine risultato
<Q> = qualita' (se F2 jpeg)
<D> = DPI (ammesso che abbiano un senso)
.
Il codice calcola opportunamente i parametri di cui sopra, quindi compone la riga di comando e la passa a convert. Non so nemmeno (ho dato solo un'occhiata alle funzioni piu' comuni) se le API di Imagemagick prevedano una cosa simile.
.
Grazie per la disponibilita'.
Saluti.
Riccardo.
Titolo: Re:ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 12, 2017, 07:06:49 am
-size <H1xV1> caption:<S> <F2> +swap -gravity south
avrebbe dovuto essere <F1> non <F2>

Scusate la svista

Saluti
Riccardo




Titolo: Re:ImageMagick
Inserito da: xinyiman - Ottobre 12, 2017, 08:09:42 am
Bhe allora se non devi solo ridimensionare e ti serve l'aiuto di imagemagik comunque non ti serve a nulla.
Titolo: Re:ImageMagick
Inserito da: SB - Ottobre 15, 2017, 09:52:54 am
Concordo con xinyiman. Lancia l'eseguibile esterno. E' più semplice e pulito.
Per i tempi, anni fa mi presi la briga di testare il lancio di un eseguibile esterno (allora si trattava di eseguibili CGI per pagine web).
Dunque anni fa, con catorci rispetto ai computer attuali, un eseguibile partiva in 3 centesimi di secondo... Lanciane anche un migliaio, mi pare che il tempo sia trascurabile. I tempi di solito riguardano altri aspetti dell'esecuzione che avresti comunque con le dll

Titolo: Re:ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 17, 2017, 06:35:24 am
Concordo con xinyiman. Lancia l'eseguibile esterno. E' più semplice e pulito.
La cosa buffa e' che ho sempre fatto cosi'. Cioe' ho sempre lanciato l'EXE.
Pero' pensavo: come sono ganzi quelli che usano le DLL, forse un giorno imparero' ad usarle.
E invece no, ero ganzo senza saperlo.
Scusate, soffro la mancanza di una preparazione teorica.
Saluti.
Riccardo.
Titolo: Re:ImageMagick
Inserito da: SB - Ottobre 17, 2017, 03:59:37 pm
Ci sono situazioni dove è meglio usare le dll e altre dove è preferibile usare gli eseguibili.

Diciamo che non è lo strumento che determina se sei un programmatore "ganzo"...
E' il saper usare lo strumento giusto per il problema da risolvere...

Useresti una Ferrari per andare su terreni impervi? O piuttosto un bello scassone rinforzato?

Titolo: Re:ImageMagick
Inserito da: Stilgar - Ottobre 21, 2017, 10:30:39 am
Ciao Riccardo.
Lancio programmi esterni vs fa tutto l'exe.
Se fa tutto l'exe che scrivi tu può essere considerata una soluzione elegante. Ma quanto tempo ti costa scrivere tutto da Zero? Lanciando programmi esterni puoi sfruttare il sistema operativo. Mica un vantaggio da poco. Ultimamente  ho scritto un affarino che scrive istruzioni per l'interprete di comando di Windows. Doveva zippare una botta di pdf. Ho lanciato i comandi in parallelo. L'elaborazione ha impiegato tutta la notte (lavoravo su dischi usb esterni).
Ho scritto il codice in meno di mezz'ora. L'affarino ha girato 20 minuti abbondanti. Ho schedulato il lancio dello script master fuori dall'orario di servizio e sono andato a casa.
Se avessi  dovuto scrivermi tutta la gestione dei thread (che non sono infiniti per singolo processo) forse quei pdf dovrebbero ancora essere caricati.
Tutti i makefile che conosco lanciano programmi esterni.. e non considero minimamente dei lamer  (termine che non mi piace perché classista a mio parere) quei pazzi che ne hanno scritto la prima versione 😊
 
Come sottolineava SB  (non ho capito se ha fatto anche una battuta o meno, ma ho riso leggendo il suo esempio) a volte bisogna saper trovare gli strumenti giusti per ottenere il risultato voluto.
Attaccheresti un chiodo al muro con una pinza?
Forse image magik è la libreria/tool adatto. Ti chiedo se hai valutato brga di lazarus. Per il ridimensionamento delle immagini credo sia sufficiente. Poi non ho idea del resto dei parametri che hai indicato cosa facciano. Carica un buon numero di formati grafici per la mia piccola esperienza con quella libreria.

(Per la formazione... conosco ingegneri informatici che mi parlano dei puntatori ad oggetti in Java ... e penso di aver già detto tutto con questo aneddoto sulla prepapreparazione formale di certi soggetti).

Titolo: Re:ImageMagick
Inserito da: Stilgar - Ottobre 21, 2017, 10:40:36 am
xinyiman non è proprio vero che agganciare una dll e lanciare un programma scritti da altri è equivalente.
Se lanci una dll potresti infrangere la licenza gnu ad esempio. Lanciando l'eseguibile no. A volte ci dimentichiamo degli avvocati 😂😂😂. E ho letto cose da mal di testa su questo argomento in alcuni forum.
Resta valido il concetto sull'uso di codice altrui però. Lo stai sempre usando.
Titolo: Re:ImageMagick
Inserito da: xinyiman - Ottobre 21, 2017, 07:43:23 pm
xinyiman non è proprio vero che agganciare una dll e lanciare un programma scritti da altri è equivalente.
Se lanci una dll potresti infrangere la licenza gnu ad esempio. Lanciando l'eseguibile no. A volte ci dimentichiamo degli avvocati 😂😂😂. E ho letto cose da mal di testa su questo argomento in alcuni forum.
Resta valido il concetto sull'uso di codice altrui però. Lo stai sempre usando.

Hai perfettamente ragione  ;)
Titolo: Re:ImageMagick
Inserito da: Riccardo Ferrari - Ottobre 22, 2017, 05:18:35 am
Continuo questo thread raccontando la mia esperienza, supponendo che interessi.
Dunque, la velocità: ho già scritto come non capivo il motivo del cambiamento della velocità, avendo però la vaga idea che dipendesse dai parametri passati al programma esterno (ImageMagick). Ieri l'ho capito: riscrivo una paio di righe del mio codice per modificare l'output e noto un leggero rallentamento (avevo inserito un timer), circa il 10%. Credo che dipenda dalle ultime varianti al codice: cambia questo, cambia quello … niente da fare. Mi viene in mente che avevo già modificato un parametro del programma esterno: l'altezza del testo che viene sovrascritto all'immagine (si tratta del parametro V1 del codice che ho già postato). Faccio delle prove: più piccolo è il testo più piano va ImageMagick. Anche sensibilmente. Molto sensibilmente. Esagero ed imposto un'altezza sproporzionata (occupa tutta l'immagine): rapidissimo. Esagero al contrario e la metto piccolissima, quasi invisibile senza zoomare: lentissimo. Mi sfuggono i motivi di ciò.
Benché debba concordare con ciò che è stato scritto (hai un EXE esterno che fa quello che ti serve: usalo) non nascondo che la mia ambizione di programmatore dilettante (molto dilettante) sarebbe di scrivere un mio codice che faccia tutto senza bisogno di programmi esterni.
Però … a ben vedere, ammesso di riuscirci, con molta fatica, si tratterebbe di inserire in un mio codice di coordinamento delle procedure o funzioni trovate in giro nel web. Quindi non avendo nessun merito: siamo al solito punto. Riflessioni notturne. Lasciamo perdere.
Saluti.
Riccardo
Titolo: Re:ImageMagick
Inserito da: SB - Ottobre 22, 2017, 09:53:14 am
Se lanci una dll potresti infrangere la licenza gnu ad esempio. Lanciando l'eseguibile no. A volte ci dimentichiamo degli avvocati 😂😂😂. E ho letto cose da mal di testa su questo argomento in alcuni forum.
Resta valido il concetto sull'uso di codice altrui però. Lo stai sempre usando.

Sante parole!
In Italia siamo un po' troppo superficiali perchè tanto... lo fanno tutti.
Ci dimentichiamo quanto ci esponiamo non solo tecnicamente, ma anche legalmente ad usare codice altrui.
Il giorno che gli avvocati, al momento ignoranti (nel senso buono che ignorano :) ), annuseranno l'affare, mi sa che inizieremo a vederne delle belle...
Titolo: Re:ImageMagick
Inserito da: SB - Ottobre 22, 2017, 09:59:27 am
... più piccolo è il testo più piano va ImageMagick...

è sempre interessante leggere le esperienze altrui :)
Senza altre indicazioni ipotizzerei che il ridimensionamento del testo (caratteri definiti vettorialmente come coordinate di punti) potrebbe dare qualche problema per piccole dimensioni nel momento in cui le coordinate devono essere convertite in numeri interi per disegnare i pixel nell'immagine. Magari qualche routine interna scritta in maniera non molto robusta potrebbe dare qualche problema.
Chissà...
Titolo: Re:ImageMagick
Inserito da: Stilgar - Ottobre 22, 2017, 08:34:40 pm
Qui parlano dei font https://imagemagick.org/discourse-server/viewtopic.php?t=6171
Era il 2006 guardando le date del forum.

Stilgar