2010-01-10 5 views
4

J'ai une fonction qui prend un bitmap, en copie une partie et l'enregistre en tant que 8bpp tiff. Le nom de fichier de l'image de résultat est unique et le fichier n'existe pas, le programme a l'autorisation d'écrire dans le dossier cible.System.Drawing.Image.Save throws ExternalException: Une erreur générique s'est produite dans GDI

void CropImage(Bitmap map) { 
     Bitmap croped = new Bitmap(200, 50); 

     using (Graphics g = Graphics.FromImage(croped)) { 
      g.DrawImage(map, new Rectangle(0, 0, 200, 50), ...); 
     } 

     var encoderParams = new EncoderParameters(2); 
     encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8L); 
     encoderParams.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionNone); 

     croped.Save(filename, tiffEncoder, encoderParams); 
     croped.Dispose(); 
    } 

chose étrange est que ce funcion fonctionne bien sur certains ordinateurs (Win 7) et jette System.Runtime.InteropServices.ExternalException: Une erreur générique est produite dans GDI exception sur d'autres ordinateurs (la plupart du temps Win XP).

Tous les ordinateurs ont l'environnement d'exécution .NET 3.5 SP1 installé.

Si j'utilise croped.Save(filename, ImageFormat.Tiff); au lieu de croped.Save(filename, tiffEncoder, encoderParams); cela fonctionne sur tous les ordinateurs, mais j'ai besoin de sauvegarder Tiff au format 8bpp.

Avez-vous des idées, où le problème pourrait être?

Merci, Lukas

+0

peut-être que la photo n'est pas encore enregistrée et commence à être éliminée? – serhio

+0

Existe-t-il des machines Windows XP sur lesquelles cela fonctionne? – SLaks

+0

GDI + a été mis à jour vers la version 1.1 dans Vista. Je n'ai jamais trouvé de document décrivant les changements. On dirait que vous en avez trouvé un. –

Répondre

1

GDI est une fonctionnalité du système d'exploitation Windows. J'ai rencontré des problèmes similaires en traitant des fichiers TIFF 16 bits, et ai eu recours à une bibliothèque différente. L'aide MSDN suggère que la fonctionnalité est disponible, mais à ce moment-là, Windows lance des exceptions «erreur générique» lorsque vous essayez de copier un bitmap dans un nouveau bitmap ou l'enregistrez dans un fichier ou un flux. En effet la même fonctionnalité fonctionne bien sur Windows7 (qui semble avoir un bon support TIFF). Voir New WIC functioanity in Windows 7.

L'autre solution que j'ai utilisée est de faire une copie non sécurisée en 8 bits. De cette façon, j'ai été en mesure d'enregistrer des fichiers PNG (avec palette). Je n'ai pas essayé cela pour le TIFF.

 // part of a function taking a proprietary TIFF tile structure as input and saving it into the desired bitmap format 
     // tile.buf is a byterarray, containing 16-bit samples from TIFF. 

     bmp = new Bitmap(_tile_width, _tile_height, PixelFormat.Format8bppIndexed); 
     System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height); 
     BitmapData bmpData =bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,bmp.PixelFormat); 
     int bytes = bmpData.Stride * bmp.Height; 

     dstBitsPalette = (byte *)bmpData.Scan0; 

     offset=0; 


     for (offset = 0; offset < _tile_size; offset += 2) 
     { 
      dstBitsPalette[offset >> 1] = tile.buf[offset + 1]; 
     } 

     // setup grayscale palette 
     ColorPalette palette = bmp.Palette; 
     for (int i = 0; i < 256; i++) 
     { 
      Color c = Color.FromArgb(i, i, i); 
      palette.Entries[i] = c; 
     } 
     bmp.Palette = palette; 
     bmp.UnlockBits(bmpData); 

     return bmp; 

    } 
Questions connexes