Crad's .NET Blog

L'UGIblog di Marco De Sanctis
posts - 190, comments - 457, trackbacks - 70

Caricamento di un oggetto Image da file

La creazione di un oggetto di tipo Image da un file nasconde una piccola insidia. Consideriamo il seguente snippet di codice:

Image myImage = Image.FromFile("filename.jpg")

Ciò che accade dietro le quinte è che nel field

internal IntPtr nativeImage

viene memorizzato un handler al file filename.jpg, che rimane aperto finché non si richiama il metodo Dispose() di myImage. Il problema è che, ovviamente, il file risulta bloccato e il sistema ha una risorsa impegnata; inoltre, se dimentichiamo di effettuare la Dispose, questa situazione perdura fino a che non viene effettuato un GarbageCollecting o, al peggio, fino alla chiusura dell'applicazione.

Come ovviare? Personalmente, quando devo caricare un'immagine da file, faccio così:

Image myImage;
using (Image img = Image.FromFile("filename.jpg")
{
    myImage = 
new Bitmap(img);
}

Il costruttore dell'oggetto Bitmap, infatti, carica l'immagine e la salva sull'oggetto stesso utilizzando GDI+; da Reflector:

public Bitmap(Image original, int width, int height) : this(width, height)
{
      
using (Graphics graphics1 = null)
      {
            graphics1 = Graphics.FromImage(
this);
            graphics1.Clear(Color.Transparent);
            graphics1.DrawImage(original, 0, 0, width, height);
      }
}

In questo modo non facciamo altro che applicare la best practice che consiglia di tenere impiegata una risorsa esterna per il minor tempo possibile.

Ciao

powered by IMHO 1.3

Print | posted on mercoledì 9 agosto 2006 16:25 | Filed Under [ .Net 2.0 Windows Forms ]

Powered by:
Powered By Subtext Powered By ASP.NET