#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 «. Без внутреннего исключения и никаких других объяснений.