Newsgroup: it.comp.lang.delphi
Titolo: Thumbnails immagini [LONG]

Mi auguro che qualcuno di voi possa aiutarmi dandomi una soluzione
definitiva al mio problema.
Ho l'esigenza di inserire nel mio programma all'interno di uno scrollbox
delle anteprime di immagini (ovviamente la generazione di oggetti a run-time
non è un problema) anche numerose dato che posso avere casi con anche
100-150 piccole immagini.
Il problema è che le immagini di cui devo creare l'anteprima sono ad
altissima qualità (almeno 1600x1200) e quindi iniziamo già a scartare
semplici oggettini Timage.
A questo punto ho pensato di usare la funzione bitblt, appoggiando prima
l'immagine originale su un oggetto Timage rimpicciolendo la dimensione e poi
catturare i pixel dell'immagine ottenuta e disegnarne una nuova. Il
risultato ottenuto è graficamente buono ma improponibile in termini di
tempo, infatti per usare la bitblt occorre effettuare una conversione delle
immagini da jpeg a bitmap tramite il metodo Assign che per le immagini da me
considerate impiega almeno 2 secondi (su un p3-700 e l'applicazione dovrebbe
girare anche su pc più lenti) con il risultato che già per 50 immagini pur
avendo solo pochi kilobyte di ram allocati ho tempi di attesa intorno ai 100
secondi, improponibile a livello utente.
A questo punto ho cambiato strada cercando un componente già preconfezionato
ma le delusioni sono arrivate una dopo l'altra. Se il componente è veloce si
divora la memoria Ram del sistema (con 60 immagini arrivo al fatidico
messaggio: Non c'è abbastanza memoria per eseguire l'applicazione) oppure se
il componente lavora senza usare la Ram è lento da morire.
Anche le VCL sono impotenti in quanto chiunque può provare l'esempio di
generazione di thumbnail ad esse allegato, è anch'esso un divoratore di RAM.
A questo punto porgo finalmente la mia domanda: come posso fare ad ottenere
un risultato simile ad ACDSEE o ad Explorer veloci e non occupatori i ram?
Un collega mi ha consigliato di cercare tra le api di windows quella che in
explorer fa apparire l'immagine quando ci cliccki sopra in basso a sinistra
alla velocità della luce, ma non ho un idea di dove sbattere la testa e per
questo gradirei molto un aiuto soprattutto da chi ha maggiore esperienza di
grafica rispetto a me.
Ogni consiglio è ben accetto.
SAluti
Giò

> Ogni consiglio è ben accetto.
fregatene della ram, le macchine oggigiorno ne hanno in abbondanza, e
privilegia la velocita' e il risparmio del *tuo* tempo di sviluppo, che
senz'altro vale molto piu' di un banco di ram da 512 MB ;).
Ciao, Sandro

 Ogni consiglio h ben accetto.
Salve
ti posso consigliare di utilizzare la libreria di classi TFastDIB.
Con questa sono riuscito a realizzare un sistema di editing video che 
mi applica dei filstri ed effetti standard quali luminanza, colorazione,
 contrasto luminosita etc. in tempo reale su filmati video.
Se non riesci a trovarla in rete (il sito ufficiale e da molto offline),
 te la posso mandare via email.
Comunque per quello che riguarda le anteprime, sia ACDSEE che 
PaintShoppro utilizzando dei file temporanei in cui scrivono le 
thumbnails della directori in cui sono, praticamente caricano immagine 
per immagine, creano la thumbnail, la salvano nel file, scaricano 
l'immagine e continuano cosi, in questo modo mantieni in memoria 
solamente le thumbnails e non le immagini complete.
Saluti.

semplici oggettini Timage.
Puoi usare benissimo i TImage, a patto che ci carichi dentro i
thumbnail che hai _già_ creato e non le immagini 1600x1200
"stretchate".
-- 
Andrea Laforgia
www.geocities.com/andrealaforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

 ha scritto nel messaggio
news:mGVea.37302$Lr4.1...@twister2.libero.it...


 senz'altro vale molto piu' di un banco di ram da 512 MB ;).
Il mio tempo vale se raggiunge uno scopo, se io produco un programma che non
funziona e non lo vuole nessuno, ho buttano via "tutto" il mio tempo dal
momento in cui ho scritto il primo "begin". Se un software è ben fatto ne
pui vendere il doppio delle copie, se lo scrivi in fretta senza considerare
tutti i casi e senza valutare le risorse occupate, nonchè l'uso semplice ma
stabile e impeccabile anche di persone inesperte e con macchine anche abb.
obsolete significa che non hai ancora capito cosa significa scrivere un
programma. Se te lo fai per te fai quello che vuoi ma da dare in giro non mi
sembra il caso.....
Ricorda.... Linux gira ancora su un 386......
Saluti Giò


comprarti un cray.
[cutted]
Il tuo discorso va *generalmente* bene , ma nella pratica di ogni giorno
abbiamo la dimostrazione di come quello che conta sia la velocita' (sia della
macchina che dello sviluppo).
Se sei veloce a sviluppare allora puoi prendere diversi lavori e soddisfare
sempre piu' clienti, anche i meno pazienti.
Questo ovviamente non significa che le tue analisi debbano essere
superficiali, ma bisogna sempre tenere conto che il mercato impone delle
regole (a volte folli) da rispettare se non ci si vuole trovare il bilancio in
passivo.
Il cliente si lamenta che il mio gestionale e' lento perche' e' costretto a
girare in 64MB di ram? Glie ne do' 128Mega, e il programma lo usa normalmente.
Devo perder giorni di sviluppo per cercare la soluzione piu' veloce e meno
esosa di risorse, oppure gli faccio cambiare un banco di ram? La risposta e'
ovvia... anche se la soluzione non e' molto "professionale".
Si, e' vero che linux gira ancora su un 386, ma quante aziende usano i 386 per
un server aziendale o per lavorarci ancora sopra? 
Alla fine, la conclusione e': il mercato detta le regole, noi dobbiamo
attenerci, siano regole equilibrate o no.
Chiedo scusa al ng per essere finito in OT.
Ciao
--
Morde. 
morde[at]programmer[.]net

 Morde.
HAve fun
Giò
--


> non si può obbligare la gente a cambiare macchina per ogni software.
non dicevo questo. Dicevo che se un cliente si ostina a voler usare una
macchina vecchia (es. Win98 con 64 Mb di RAM) e a te una macchina del genere
sta stretta per vari motivi (es. poca stabilita' del sistema, poca ram
disponibile, possibili casini per via di driver, corruzione del registro,
ecc.) e a te ottimizzare un'applicazione per farla girare su una macchina
vecchia costa x ore di lavoro in piu', allora quantomeno addebitagli quelle
ore di lavoro. Il cliente in questo modo sapra' che il programma anziche' x
euro gli costa il doppio di x euro, e che comunque facendolo girare su una
macchina vecchia avra' scarsa sicurezza e prestazioni modeste. Poi valutera'
lui se e' il caso di pagare di piu' te e tenersi il pc obsoleto, oppure se
passare ad una tecnologia piu' moderna in tutti i sensi.
Ciao, Sandro