* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

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

Inserisci il nome utente, la password e la durata della sessione.

173 Visitatori, 0 Utenti

Autore Topic: ImageMagick  (Letto 6501 volte)

Riccardo Ferrari

  • Newbie
  • *
  • Post: 34
  • 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: 3249
  • Karma: +12/-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: 34
  • 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: 3249
  • Karma: +12/-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: 34
  • 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: 3249
  • Karma: +12/-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: 34
  • 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: 34
  • 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: 3249
  • Karma: +12/-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
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-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: 34
  • 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
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-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?


Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:ImageMagick
« Risposta #12 il: 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).

Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:ImageMagick
« Risposta #13 il: 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.
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

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

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18771
  • Topic in totale: 2233
  • Online Today: 427
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 173
Total: 173

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.