Сжатие существующего файла TIFF в c#

#c# #tiff

#c# #tiff

Вопрос:

У меня есть тысячи файлов TIFF размером 32 МБ, потому что к ним не было добавлено сжатие. Мне нужно просмотреть их и сжать каждый из них с помощью LZW. Чтобы ускорить это, я сжимаю только одностраничные файлы TIFF, которых большинство.

Я получаю общую ошибку GDI при запуске этого. Однако, если я использую другое имя файла при сохранении, он работает нормально.

 DirectoryInfo d = new DirectoryInfo(@"D:Datalzwtest");
FileInfo[] Files = d.GetFiles("*.tif");
foreach (FileInfo file in Files)
{
    Bitmap image1 = (Bitmap)Image.FromFile(file.FullName);
    int tiffpages = image1.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
    if (tiffpages == 1)
    {
        image1.Save(@"D:Datalzwtest"   file.Name, myImageCodecInfo, myEncoderParameters);
    }
}
  

Если я изменю изображение 1.Сохраните строку в следующем, тогда она сработает (просто добавьте «test-» в начало имени файла.

 image1.Save(@"D:Datalzwtesttest-"   file.Name, myImageCodecInfo, myEncoderParameters);
  

Любая помощь приветствуется!

Комментарии:

1. Есть сообщение об ошибке? Может быть, внутреннее исключение?

2. Перезапись изображения, которое вы только что прочитали, часто сложнее, чем ожидалось. Помимо того, что в первую очередь этого избежать, необходимо избавиться от него.. Также помогает чтение его с помощью метода Stream. Найдите «Перезапись существующего изображения»!

3. Чтобы добавить то, что сказал @TaW, для этого я обычно считываю ФАЙЛ в массив байтов, а затем открываю изображение из потока памяти. Это позволяет безопасно перезаписать тот же файл.

Ответ №1:

Для растрового изображения необходимо использовать промежуточное хранилище.

 DirectoryInfo d = new DirectoryInfo(@"D:Datalzwtest");
FileInfo[] Files = d.GetFiles("*.tif");
foreach (FileInfo file in Files)
{
    using(MemoryStream ms = new MemoryStream(File.ReadAllBytes(file))) 
    {
        Bitmap image1 = (Bitmap)Image.FromStream(ms);
        int tiffpages = image1.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
        if (tiffpages == 1)
        {
             image1.Save(@"D:Datalzwtest"   file.Name, myImageCodecInfo, myEncoderParameters);
        }
    }
}
  

Проблема в том, что GDI блокирует источник растрового изображения, будь то файл или поток. в этом случае нам все равно, заблокирован ли MemoryStream.

И я желаю разработчикам GDI часов сидения на неудобном стуле из-за этой «Общей ошибки GDI «. Без внутреннего исключения и никаких других объяснений.