2010-04-19 4 views
1

Im chargement d'une image à partir d'une base de données SQL CE, puis tentative de chargement dans une PictureBox.Exception OutOfMemory lors du chargement d'une image dans .Net

Je sauve l'image comme ceci:

if (ofd.ShowDialog() == DialogResult.OK) 
      { 
       picArtwork.ImageLocation = ofd.FileName; 
       using (System.IO.FileStream fs = new System.IO.FileStream(ofd.FileName, System.IO.FileMode.Open)) 
       { 
        byte[] imageAsBytes = new byte[fs.Length]; 
        fs.Read(imageAsBytes, 0, imageAsBytes.Length); 
        thisItem.Artwork = imageAsBytes; 
        fs.Close(); 
       } 
      } 

puis sauver à l'aide de Db LINQ to SQL.

je charge l'image en arrière comme si:

using (FileStream fs = new FileStream(@"C:\Temp\img.jpg", FileMode.CreateNew ,FileAccess.Write)) 
       { 
        byte[] img = (byte[])encoding.GetBytes(ThisFilm.Artwork.ToString()); 
        fs.Write(img, 0, img.Length); 
       } 

mais je reçois un OutOfMemoryException. J'ai lu que c'est un léger hareng rouge et qu'il y a probablement quelque chose qui ne va pas avec le type de fichier, mais je ne peux pas comprendre quoi.

Des idées?

Remerciements picArtwork.Image = System.Drawing.Bitmap.FromFile (@ "C: \ Temp \ img.jpg");

+0

Quel est le type de cetItem.Artwork? Vous lui attribuez des octets dans le premier bloc de code, mais dans le second bloc de code, vous convertissez Artwork ToString, puis convertissez-le en octets. Pourquoi les conversions multiples? – dthorpe

Répondre

0

D'après le code que vous avez indiqué, il semble que vous traitez l'image comme une chaîne. Il se peut que les données soient perdues avec la conversion de byte [] en chaîne et string en byte [].

Je ne suis pas familier avec SQL CE, mais si vous le pouvez, vous devriez envisager de traiter les données comme un octet [] et ne pas encoder vers et depuis une chaîne.

Nous fondons notre hypothèse dans cette ligne de code

byte[] img = (byte[])encoding.GetBytes(ThisFilm.Artwork.ToString()); 
+0

J'ai enlevé le .ToString() et cela a fonctionné comme un charme. Bien repéré. À votre santé. – Ben

0

Le GDI a le mauvais comportement de lancer une exception de MOO chaque fois qu'il n'est pas capable de comprendre un certain format d'image. Utilisez Irfanview pour voir quel type d'image est réellement, il est probable que GDI ne puisse pas le gérer.

+0

Eh bien, c'est un fichier que j'ai ajouté moi-même, donc je sais que c'est un fichier .jpg. Est-ce que .Net fait une transformation du format? – Ben

+0

Il ne devrait pas altérer le format, mais si c'est le cas, il devrait certainement être un format pris en charge par GDI, car il vient de GDI. – dthorpe

0

Mon conseil serait de ne pas utiliser un FileStream pour charger des images à moins que vous avez besoin d'accéder aux octets bruts. Au lieu de cela, utilisez les méthodes statiques fournies dans les objets ou Bitmap Image:

Image img = Image.FromFile(@"c:\temp\img.jpg") 
Bitmap bmp = Bitmap.FromFile(@"c:\temp\img.jpg") 

Pour enregistrer le fichier utiliser la méthode .Save de l'image ou de l'objet Bitmap:

img.Save(@"c:\temp\img.jpg") 
bmp.Save(@"c:\temp\img.jpg") 

Bien sûr, nous ne savons pas ce tapez ArtWork est. Souhaitez-vous partager cette information avec nous?

Questions connexes