2017-06-06 2 views
0

Ich versuche, ein kleines Programm zu erstellen, um eine Reihe von mehrseitigen TIFF-Dateien aus einem Ordner zu nehmen, die Titelseite zu entfernen und die verbleibenden Seiten mit demselben Namen in einem separaten Ausgabeordner zu speichern .C# generischer Fehler GDI + bei SaveAdd

Die Dateien können in den Ausgabeordner ohne Problem gespeichert werden, aber ich bekomme "Ein generischer Fehler aufgetreten in GDI +", wenn es auf die SaveAdd-Funktion auf dem zweiten Dokument. Das erste Dokument (7 Seiten bei Ausgabe) fügt alle Seiten korrekt hinzu. Das zweite Dokument schlägt fehl, wenn nach der ersten Seite weitere Seiten/Frames hinzugefügt werden sollen. Ich habe verschiedene Dokumente als erste und zweite mit verschiedenen Seiten probiert. Kann jemand das Thema beleuchten?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 

namespace FrontPageRemover 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Image frame; 
      int pages; 
      string fileName; 

      string folderPath = @"TIFF\Tiff Files"; 
      string[] files = Directory.GetFiles(folderPath); 
      Image image; 

      Encoder encoder = Encoder.SaveFlag; 
      ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"); 
      EncoderParameters encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

      foreach (string file in files) 
      { 
       image = Image.FromFile(file); 
       pages = image.GetFrameCount(FrameDimension.Page); 
       image.SelectActiveFrame(FrameDimension.Page, 1); 

       fileName = Path.GetFileName(file); 
       image.Save(@"TIFF\Files Out\" + fileName, encoderInfo, encoderParams); 

       for (int index = 2; index < pages; index++) 
       { 
        image.SelectActiveFrame(FrameDimension.Page, index); 
        encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); 
        image.SaveAdd(encoderParams);      
       } 

       encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
       image.SaveAdd(encoderParams); 
       image.Dispose(); 
      } 

     } 
    } 
} 
+0

Die 'EncoderParameter' Klasse implementiert' IDisposable' und sollte deshalb entsorgt werden. Dein Code verliert es. Überlegen Sie sich, 'using'-Blöcke zu verwenden, um sich davor zu schützen, Anrufe durchgängig auf' Dispose' zu ​​verteilen. Möglicherweise müssen auch andere Objekte entsorgt werden. Überprüfen Sie Ihren Code sorgfältig auf Undichtigkeiten. Für das, was es wert ist, erhalten Sie * immer * diese Fehlermeldung, wenn ein Fehler in GDI + auftritt, und der System.Drawing-Namespace ist ein großer Wrapper um GDI +. –

+0

Verwaltet, um es zu lösen. Das Ankreuzen des Kontrollkästchens "32-Bit bevorzugen" wurde nicht korrigiert, sodass es erneut wiederholte, was ich bereits angenommen hatte, dass etwas innerhalb der Schleife nicht gelöscht oder ausgelöst wurde. Ich fing an, auf IDispose zu lesen (ich bin Autodidakt, also muss ich jedes Mal, wenn ich Code schreibe, mindestens eine Sache nachsehen!) Und erkannte, dass ich Param außerhalb der Schleife setzte. Durch das Einbringen wurde das Problem behoben. Danke für die Hinweise :) – N1ghtwolf89

Antwort

0

Kommentare zeigten mir in die richtige Richtung in Bezug auf die EncoderParameters nicht korrekt aktualisiert werden.

Das Problem war mit

encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

außerhalb der Schleife ist. Daher funktioniert das erste Dokument korrekt, aber das zweite Dokument schlägt fehl.

Verwandte Themen