2013-08-11 1 views
4

J'essaie de convertir plusieurs images en un fichier image multi-tiff. Quand je cours le code ci-dessous sur plus d'une image je reçois une "Une erreur générique s'est produite dans GDI +." Erreur. Si j'ai juste une image alors cela fonctionne bien et sort le fichier. Si je change le code en bitmap et la liste en bitmap alors le code fonctionne bien avec plusieurs images.MetaFile to Multi-Tiff Image

public List<Metafile> metaFileList = new List<Metafile>(); 

private void writeImagesToEnhancedMetaMulTiff() 
{ 
     ImageCodecInfo info = null; 
     foreach (ImageCodecInfo ice in ImageCodecInfo.GetImageEncoders()) 
      if (ice.MimeType == "image/tiff") 
       info = ice; 

     System.Drawing.Imaging.Encoder enc = System.Drawing.Imaging.Encoder.SaveFlag; 

     EncoderParameters ep = new EncoderParameters(1); 
     ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame); 
     Metafile pages = null; 

     int frames = 0; 

     foreach (Metafile metaFileItem in metaFileList) 
     { 
      if (frames == 0) 
      { 
       pages = metaFileItem; 
       pages.Save(@"E:\output_MetaFile.tif", info, ep); 
      } 
      else 
      { 
       ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage); 
       pages.SaveAdd(metaFileItem, ep); 
      } 
      if (frames >= metaFileList.Count() - 1) 
      { 
       ep.Param[0] = new EncoderParameter(enc, (long)EncoderValue.Flush); 
      } 
      frames++; 
     } 
    } 

Pour accéder au presse-papiers obtenir le métafichier comme je l'ai utilisé ce code:

public System.Drawing.Imaging.Metafile GetEnhMetafileOnClipboard(IntPtr hWnd) 
    { 
     System.Drawing.Imaging.Metafile meta = null; 
     if(OpenClipboard(hWnd)) 
     { 
      try 
      { 
       if (IsClipboardFormatAvailable(CF_ENHMETAFILE) != 0) 
       { 
        IntPtr hmeta = GetClipboardData(CF_ENHMETAFILE); 
        meta = new System.Drawing.Imaging.Metafile(hmeta, true); 
        metaFileList.Add(meta); 
       } 
      } 
      finally 
      { 
       CloseClipboard(); 
      } 
     } 
     return meta; 
    } 

Laissez-moi savoir si vous avez besoin de fournir plus de code.

Merci.

Répondre

0

J'ai toujours évité d'utiliser la méthode Save de Metafile quand je veux la pixelliser. Au lieu de cela, je dessine à un bitmap et convertit et enregistre le Bitmap.

Quelque chose comme:

    GraphicsUnit uPix = GraphicsUnit.Pixel; 

        RectangleF bounds = meta.GetBounds(ref uPix); 
        Bitmap dstBitmap = new Bitmap((int)bounds.Width, (int)bounds.Height, PixelFormat.Format32bppArgb); 


        Graphics g = Graphics.FromImage(dstBitmap); 
        g.Clear(Color.White); 
        g.DrawImage(meta, dstBitmap.GetBounds(ref uPix), meta.GetBounds(ref uPix), uPix); 

        dstBitmap.Save(@"E:\output_MetaFile.tif",info,ep); 

Lors de l'obtention d'un Metafile du presse-papiers-je utiliser ce code ususally car il est très important de copier les données du presse-papiers dans le cas de Métafichiers:

if(iData.GetDataPresent(DataFormats.EnhancedMetafile)) 
     { 

      // Get the meta data from the clipboard 
      IntPtr hwnd = this.Handle; 
      if(OpenClipboard(hwnd) == false) return false; 
      IntPtr hToTempPastedEmf = GetClipboardData(14); //CF_ENHMETAFILE=14 

      // Get the size of the meta data 
      int iSize = GetEnhMetaFileBits(hToTempPastedEmf,0,IntPtr.Zero);        
      // Copy the meta file from the clipboard (MUST remove all references to the clipboard) 
      IntPtr hToPastedEmf = CopyEnhMetaFile(hToTempPastedEmf, new IntPtr(0)); 
      Metafile meta = new Metafile(hToPastedEmf,false); 

      CloseClipboard(); 

     }