nina4ever Ответов: 2

Asp.net общая ошибка в GDI+ on image.save при разделении изображения tiff


Дорогие все,
я использую следующий код в веб-приложении (ASP.NET/C#) для разделения изображения tiff:

public void SplitTiffImage(string inputFilePath, EncoderValue format)
    {
try{
        using (FileStream fs = new FileStream(inputFilePath, FileMode.Open,  
               FileAccess.Read) )
        {
            using (Image temp_image = Image.FromStream(fs))
            {
                Guid objGuid = temp_image.FrameDimensionsList[0];
                FrameDimension objDimension = new FrameDimension(objGuid);

                //Saves every frame as a separate file.
                Encoder enc = Encoder.Compression;
                int curFrame = 0;
                for (int i = 0; i < page_number; i++)
                {
                    temp_image.SelectActiveFrame(objDimension, curFrame);
                    EncoderParameters ep = new EncoderParameters(1);
                    ep.Param[0] = new EncoderParameter(enc, (long)format);
                    ImageCodecInfo info = GetEncoderInfo("image/tiff");

                    string fileName = string.Format("{0}_{1}.tif", "some_name",
                                                i.ToString());

                    temp_image.Save(fileName, info, ep);               

                    curFrame++;

                }// for

            }// using imgage

        }// using filestream

        File.Delete(inputFilePath);
}catch(Exception x){
/*do something*/}
    }	


я называю это так:

SplitTiffImage(ImageFullPath , EncoderValue.CompressionNone);


я проверил код несколько раз. иногда он работает успешно, а иногда терпит неудачу : он сохраняет много кадров, а затем терпит неудачу в
temp_image.Save(fileName, info, ep)

с общей ошибкой, возникшей в GDI+. это происходит в случайных кадрах, а не в конкретном.

Что я уже пробовал:

я уверен, что у пользователя есть разрешения..
я протестировал код на многих tiff-файлах. он успешно работает для файла, и в следующий раз он терпит неудачу для того же файла !
я прокомментировал файл.Оператор Delete, чтобы убедиться, что исходный файл не затронут, но результаты не изменились

#realJSOP

поместите код в блок try/catch.

nina4ever

он уже был в блоке try catch, и исключение таково : generic error occurred at GDI+ ... at Image.Save

2 Ответов

Рейтинг:
5

nina4ever

чтобы избежать ошибки GDI+, я использовал вместо этого Microsoft Windows Imaging Components (WIC). вот хорошая страница с кодом для разделения и слияния tiff

Ускорить обработку TIFF файл с Microsoft Windows, компоненты визуализации (Вик)


а вот и метод расщепления :

public static void SPlitTiffWIC(string fileName)
{
 
    TiffBitmapEncoder newFileEncoder = null;
 
    FileInfo fi = new FileInfo(fileName);
    using (Stream documentStream = fi.OpenRead())
    {
 
        TiffBitmapDecoder originalFileDecoder = 
        new TiffBitmapDecoder(documentStream,
            BitmapCreateOptions.PreservePixelFormat,  
            BitmapCacheOption.None);
        foreach (BitmapFrame frame in originalFileDecoder.Frames)
        {
            newFileEncoder = new TiffBitmapEncoder();
            newFileEncoder.Frames.Add(frame);
            using (FileStream stream = File.Create("c:\\tiffs\\"  
                          + Guid.NewGuid().ToString() + ".tiff"))
            {
                newFileEncoder.Save(stream);
            }
 
        }
    }
}


Рейтинг:
2

dkamble 10358990

общая ошибка произошла в GDI+ , эта ошибка возникает из-за того, что ссылки на файлы изображений не закрыты должным образом, и вы пытаетесь создать или открыть один и тот же образ.

там для близких ссылок на изображения в конце функции. позвонив сборщику мусора. утилизация объекта изображения .


nina4ever

спасибо, но, как я знаю, объект image будет автоматически удален в конце блока using. мой объект изображения создается с помощью блока using. и мой файловый поток тоже

использование(Image temp_image ...){}