Как получить количество страниц в файле tiff с кодом в службе Windows

У меня есть служба Windows, которая пытается получить количество страниц в файле TIFF, используя класс Image в пространстве имен System.Drawing.

    using System.Drawing;

    private int GetNumberOfPagesFromTiffFile(string filePath)
    {
        int pageCount = 0;
        Image Tiff = Image.FromFile(filePath);
        pageCount = Tiff.GetFrameCount(FrameDimension.Page);
        Tiff.Dispose(); 

        return pageCount;
    }

Но документация Microsoft http://msdn.microsoft.com/en-us/library/system.drawing.aspx говорит не использовать System.Drawing в службе Windows. Они предложили использовать компонент Windows Imaging. Я скачал его, чтобы посмотреть, есть ли у него способ получить количество страниц в файле TIFF, но при его установке возникла ошибка. Так что у меня пока нет ответа.

Мне любопытно, что другие используют для получения количества страниц в файле TIFF в службе Windows.


person Clinton Bast    schedule 08.02.2012    source источник
comment
Как насчет того, чтобы просто пройтись по цепочке IFD? Это очень просто и не требует ничего, кроме CreateFile(), ReadFile().   -  person BitBank    schedule 09.02.2012
comment
Спасибо BitBank, эта идея отлично сработала и стала быстрее! Однако изначально я не знал, что вы имели в виду под цепочкой IFD, потому что я вообще ничего не знал о файлах TIFF. Я наконец узнал, о чем вы говорили, после прочтения некоторых веб-страниц о формате файла TIFF.   -  person Clinton Bast    schedule 10.02.2012
comment
Извините, что я был так краток в своем ответе. В следующий раз, когда кто-то спросит, я предоставлю пример кода.   -  person BitBank    schedule 14.02.2012
comment
Не мог бы кто-нибудь из вас предоставить мне небольшой пример того, как это сделать в коде? может как ответ?   -  person Milne    schedule 09.01.2014


Ответы (1)


Вот общая функция C для подсчета количества страниц в файле TIFF.

uint16_t TIFFSHORT(unsigned char *buffer, bool bMotorola)
{
uint16_t s;

if (bMotorola)
   s = (buffer[0] << 8) + buffer[1];
else
   s = buffer[0] + (buffer[1] << 8);

return s;  
}

uint32_t TIFFLONG(unsigned char *buffer, bool bMotorola)
{
uint32_t l;

if (bMotorola)
   l = (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3];
else
   l = buffer[0] + (buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24);

return l;
}

int TIFFPageCount(char *filename)
{
    int i, iTags, IFD;
    int iOffset, iTotalPages;
    unsigned char buf[8];
    FILE *handle;
    bool bMotorola;
    int iFileSize;

    handle = fopen((char *)filename, "rb");
    if (handle == NULL)
       return 0;

    // get the file size
    fseek(handle, 0, SEEK_END);
    iFileSize = (int)ftell(handle);
    fseek(handle, 0, SEEK_SET);

    i = fread(buf, 1, 8, handle); // Read TIFF header and first IFD offset

    if (buf[0] != 'I' && buf[0] != 'M')
    {
        fclose(handle);
        return 0; // Not a TIFF file
    }
    bMotorola = (buf[0] == 'M');   // get the byte order
    IFD = TIFFLONG(&buf[4], bMotorola); // Read the first IFD pointer
    if (IFD < 8 || IFD > iFileSize) // corrupt file, don't process it
    {
        fclose(handle);
        return 0;
    }

    iTotalPages = 0;

    while(IFD != 0 && IFD < iFileSize-4) // count the number of pages
    {
        fseek(handle, IFD, SEEK_SET);
        fread(buf, 1, 2, handle); // get the number of tags in this page 
        iTags = TIFFSHORT(buf, bMotorola);  // Number of tags in this dir
        i = iTags * 12 + 2; // Offset to next IFD in chain
        if (iTags > 256) // Invalid header, abort
            break;
        fseek(handle, IFD+i, SEEK_SET);
        fread(buf, 1, 4, handle); // read the next IFD value; 0 means end of chain 
        IFD = TIFFLONG(buf, bMotorola);
        iTotalPages++;
    }
    fclose(handle);
    return iTotalPages;
} // TIFFPageCount()
person BitBank    schedule 28.12.2014