* * * *
14 Visitatori, 0 Utenti

Autore Topic: ImageMagick  (Letto 113 volte)

Riccardo Ferrari

  • Newbie
  • *
  • Post: 8
  • Karma: +0/-0
ImageMagick
« il: 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

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2211
  • Karma: +6/-0
Re:ImageMagick
« Risposta #1 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

Riccardo Ferrari

  • Newbie
  • *
  • Post: 8
  • Karma: +0/-0
Re:ImageMagick
« Risposta #2 il: 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.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2211
  • Karma: +6/-0
Re:ImageMagick
« Risposta #3 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

Riccardo Ferrari

  • Newbie
  • *
  • Post: 8
  • Karma: +0/-0
Re:ImageMagick
« Risposta #4 il: 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).
e poi leggere l'output.
Saluti.
Riccardo.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2211
  • Karma: +6/-0
Re:ImageMagick
« Risposta #5 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

Riccardo Ferrari

  • Newbie
  • *
  • Post: 8
  • Karma: +0/-0
Re:ImageMagick
« Risposta #6 il: 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.

Riccardo Ferrari

  • Newbie
  • *
  • Post: 8
  • Karma: +0/-0
Re:ImageMagick
« Risposta #7 il: 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





xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 2211
  • Karma: +6/-0
Re:ImageMagick
« Risposta #8 il: 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.
Ieri è passato, domani è futuro, oggi è un dono...

SB

  • Scrittore
  • Jr. Member
  • *****
  • Post: 99
  • Karma: +0/-0
Re:ImageMagick
« Risposta #9 il: 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


Riccardo Ferrari

  • Newbie
  • *
  • Post: 8
  • Karma: +0/-0
Re:ImageMagick
« Risposta #10 il: 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.

SB

  • Scrittore
  • Jr. Member
  • *****
  • Post: 99
  • Karma: +0/-0
Re:ImageMagick
« Risposta #11 il: 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?


 

Recenti

How To

Trascinare un file nel programma da xinyiman
DB concetti fondamentali e ZeosLib da xinyiman
Recuperare codice HTML da pagina web da xinyiman
Mandare mail con Lazarus da xinyiman
Stabilire il sistema operativo da xinyiman
Esempio lista in pascal da xinyiman
File INI da xinyiman
Codice di attivazione da xinyiman
Realizzare programmi multilingua da xinyiman
Lavorare con le directory da xinyiman
Utilizzare Unità esterne da Loryea
TTreeView da xinyiman
TTreeview e Menu da xinyiman
Generare controlli RUN-TIME da xinyiman
LazReport, PDF ed immagini da xinyiman
Intercettare tasti premuti da xinyiman
Ampliare Lazarus da xinyiman
Lazarus e la crittografia da xinyiman
System Tray con Lazarus da xinyiman
UIB: Unified Interbase da Microges2000
Il file: questo sconosciuto da Microges2000
Conferma di chiusura di un applicazione da xinyiman
Liste e puntatori da Microges2000
Overload di funzioni da Microges2000
Funzioni a parametri variabili da Microges2000
Proprietà da Microges2000
Conversione numerica da Microges2000
TImage su Form e Panel da Maverich
Indy gestiore server FTP lato Client da Maverich
PopUpMenu sotto Pulsante (TSpeedButton) da Maverich
Direttiva $macro da Microges2000
Toolbar da xinyiman
Evidenziare voci TreeView da Maverich
Visualizzare un file Html esterno da Maverich
StatusBar - aggirare l'errore variabile duplicata da Maverich
Da DataSource a Excel da xinyiman
Le permutazioni da xinyiman
Brute force da xinyiman
Indy 10 - Invio email con allegati da Maverich
La gestione degli errori in Lazarus da xinyiman
Pascal Script da xinyiman
Linux + Zeos + Firebird da xinyiman
Dataset virtuale da xinyiman
Overload di operatori da Microges2000
Lavorare con file in formato JSON con Lazarus da nomorelogic
Zeos ... dietro le quinte (prima parte) da Stilgar
Disporre le finestre in un blocco unico (come Delphi) da Maverich
Aspetto retrò (Cmd Line) da xinyiman
Come interfacciare periferica twain da Narciso
Ubuntu - aggiornare free pascal e lazarus da xinyiman
fpcup: installazioni parallele di lazarus e fpc da nomorelogic
Free Pascal e Lazarus sul Raspberry Pi da nomorelogic
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal. da nomorelogic
Creare un server multithread da xinyiman
guida all'installazione di fpc trunk da subversion in linux gentoo da nomorelogic
Indice da nomorelogic
DB concetti fondamentali e connessioni standard da xinyiman
Advanced Record Syntax da nomorelogic
DB concetti fondamentali e DBGrid da xinyiman
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText da xinyiman
Advanced Record Syntax: un esempio pratico da nomorelogic
Superclasse form base per programmi gestionali (e non) da nomorelogic
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox da nomorelogic
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form da nomorelogic
Superclasse form base per programmi gestionali (e non) #4 - wait animation da nomorelogic
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog da nomorelogic
Installare lazarus su mac osx sierra da xinyiman
Utenti
Stats
  • Post in totale: 10570
  • Topic in totale: 1344
  • Online Today: 18
  • Online Ever: 74
  • (Luglio 09, 2012, 11:05:53 am)
Utenti Online
Users: 0
Guests: 14
Total: 14

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.