PDA

Visualizza la versione completa : [DELPHI] Limiti nelle dimensioni (in pixel) per TBitmap


enrico83
31-10-2007, 16:15
Ciao a tutti,
devo caricare delle immagini e in genere non mi da problemi.
Ho provato a caricare un'immagine di dimensioni 9999 X 8199 e mi da errore EOutOfResources con messaggio memoria insufficiente per eseguire il comando quando assegno il corrispettivo valore alla proprietà Height dell'oggetto Bitmap che è un TBitmap.
Volevo chiedervi se anche a voi è capitato o se sapete perchè si comporta così.

Questo è il codice:


if ('.JPG'= lExt) or ('.JPEG'= lExt) then
begin
tipoImmagine:= 'JPG';
Stream := TMemoryStream.Create;
try
Stream.LoadFromFile(nomeFile);
Stream.Seek(0, soFromBeginning);
Jpg := TJPEGImage.Create;
Jpg.LoadFromStream(Stream);
try
Bitmap.Width := JPG.Width;
Bitmap.Height := JPG.Height;
Bitmap.PixelFormat := pf24bit;
Bitmap.Canvas.Draw(0,0, JPG);
finally
JPG.Free;
end;
finally
Stream.Free;
end;
end;

Grazie in anticipo :ciauz:

pallinopinco
31-10-2007, 16:37
E' una limitazione da imputare a Windows ed al video device driver. Leggi questo articolo (http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.htm) per ulteriori spiegazioni.

alka
01-11-2007, 12:52
A parte tutto, mi chiedo che utilità possa mai avere caricare una bitmap di tali dimensioni... :master:

re dei giovani
02-11-2007, 14:19
Ciao a tutti,
quanto tempo è passato....
Conosco il problema dell'amico enrico83 perchè stiamo sviluppando insieme il progetto di tesi...un visualizzatore di immagini medicali....in particolare un DICOM viewer...che speriamo quanto prima potremo publicare rendendolo open source....come dice l'amico abbiamo questo problema dovuto al fatto che dobbiamo dare un' accesso anche a quelle immagini medicali come radiografie TC e risonanze che in un futuro potrebbero anche superare i 10000 x 10000.
Volevo fare notare che quelle immagini che non risuciamo ad aprire con il codice immesso da enrico, altri viewer che girano sullo stesso SO lo aprono...quindi come può essere un problema dovuto al SO windows?
Detto questo mi fermo perchè non è il mio campo del progetto e quindi non saprei andare molto a fondo...e la mia non è polemica....ma è una semplice domanda di curiosità....quindi grazie a chi mi darà delucidazioni....ciao :)

pallinopinco
02-11-2007, 15:35
Volevo fare notare che quelle immagini che non risuciamo ad aprire con il codice immesso da enrico, altri viewer che girano sullo stesso SO lo aprono...quindi come può essere un problema dovuto al SO windows?


Mai sentito parlare di workaround? :confused:

Le classi VCL di Delphi si appoggiano quasi sempre al sistema operativo Windows, quindi ne sfruttano i vantaggi ma ne condividono i difetti e le limitazioni.

Evidentemente i software ai quali fai riferimento si basano su codice indipendente dalle funzionalità di base offerte da Windows, in altre parole gli autori hanno aggirato il problema scrivendo da zero del codice per il caricamento e la gestione delle immagini di grandi dimensioni.

Nota: scrivere da zero <> usare TBitmap e affini

PS. Rinnovo l'invito a leggere l'articolo Very Large Bitmap Experiment (http://www.efg2.com/Lab/Graphics/VeryLargeBitmap.htm), anche perché spostando la riga Bitmap.PixelFormat := pf24bit; subito dopo il TRY dovreste avere netti miglioramenti.

alka
03-11-2007, 16:26
Originariamente inviato da re dei giovani
Volevo fare notare che quelle immagini che non risuciamo ad aprire con il codice immesso da enrico, altri viewer che girano sullo stesso SO lo aprono...quindi come può essere un problema dovuto al SO windows?
Non dico che non sia possibile accedere a tali immagini, dico solo che non potete aspettarvi di farlo in tutti i modi.

E' un po' come pretendere di caricare un film in DVD interamente in RAM per riprodurlo: il fatto che vi siano lettori in grado di mostrarti un film, non significa che scrivendo un analogo programma in Delphi, che però tratti il file caricandolo interamente, l'effetto sia lo stesso.

Non è un problema di linguaggio, funzioni o componenti, ma dell'errato uso degli stessi per ottenere l'effetto desiderato o per riuscire a manipolare quantità di dati sostanzialmente diverse.

Concludendo, se dovete lavorare su immagini di dimensioni così grandi, non potete pretendere di caricarle tutte in memoria, ma dovrete scrivere codice per consentire - con l'adozione di un formato specifico o sfruttando le opportunità offerte dal formato scelto - di caricare solo la porzione che vi interessa, o comunque di gestire l'informazione senza saturare le risorse disponibili sulla macchina in cui gira il programma.

Ciao! :ciauz:

enrico83
06-11-2007, 18:26
Ciao,
innanzitutto grazie delle risposte.


A parte tutto, mi chiedo che utilità possa mai avere caricare una bitmap di tali dimensioni...

Beh era un trucchetto che mi ero fatto per evitare di dover decomprimere l'immagine dato che poi devo lavorare sui pixel...
Finora non mi aveva dato problemi perchè non avevo ancora testato immagini di grandi dimensioni.


Mai sentito parlare di workaround?

Si imparano sempre cose nuove...

Grazie dei chiarimenti. :ciauz:

Loading