Чтение размера и разрешения файла TIFF без предварительной загрузки - PullRequest
8 голосов
/ 29 октября 2010

Как прочитать размер и ширину файла TIFF (ширина и высота) и разрешение (по горизонтали и вертикали) без предварительной загрузки его в память с помощью кода, подобного следующему. Это слишком медленно для больших файлов, и мне не нужно манипулировать ими.

Image tif = Image.FromFile(@"C:\large_size.tif");
float width = tif.PhysicalDimension.Width;
float height = tif.PhysicalDimension.Height;
float hresolution = tif.HorizontalResolution;
float vresolution = tif.VerticalResolution;
tif.Dispose();

Edit:

Эти файлы TIFF имеют двухуровневый размер 30x42 дюйма. Размер файла составляет около 1 ~ 2 МБ. Таким образом, описанный выше метод работает хорошо, но медленно.

Ответы [ 4 ]

10 голосов
/ 13 января 2011

Наткнулся на это сам и нашел решение (возможно, здесь). Image.FromStream с validateImageData = false позволяет получить доступ к информации, которую вы ищете, без загрузки всего файла.

using(FileStream stream = new FileStream(@"C:\large_size.tif", FileMode.Open, FileAccess.Read))
{
  using(Image tif = Image.FromStream(stream, false, false))
  {
    float width = tif.PhysicalDimension.Width;
    float height = tif.PhysicalDimension.Height;
    float hresolution = tif.HorizontalResolution;
    float vresolution = tif.VerticalResolution;
  }
}
2 голосов
/ 29 октября 2010

Насколько я знаю, все классы из пространства имен System.Drawing загружают данные изображения сразу, когда изображение открыто.

Я думаю, LibTiff.Net может помочь вам прочитать свойства изображения без загрузки данных изображения.Это бесплатно и с открытым исходным кодом (лицензия BSD, подходит для коммерческих приложений).

Вот пример для вашей задачи (для краткости опущены проверки ошибок):

using BitMiracle.LibTiff.Classic;

namespace ReadTiffDimensions
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Tiff image = Tiff.Open(args[0], "r"))
            {
                FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
                int width = value[0].ToInt();

                value = image.GetField(TiffTag.IMAGELENGTH);
                int height = value[0].ToInt();

                value = image.GetField(TiffTag.XRESOLUTION);
                float dpiX = value[0].ToFloat();

                value = image.GetField(TiffTag.YRESOLUTION);
                float dpiY = value[0].ToFloat();
            }
        }
    }
}

Отказ от ответственности: IЯ один из хранителей библиотеки.

1 голос
/ 29 октября 2010

Единственный способ, которым я могу придумать, - это чтение двоичного заголовка TIFF.

Здесь вы можете скачать спецификацию: http://partners.adobe.com/public/developer/tiff/index.html

Вот код, используемый для чтения TIFF, который вы можетеиспользуйте для изучения: http://www.koders.com/csharp/fidF6632006F25B8E5B3BCC62D13076B38D71847929.aspx?s=zoom

Я создал библиотеку для чтения заголовков TIFF некоторое время назад (с этими двумя ресурсами в качестве основы), но это было частью моего кода работодателя, поэтому я не могу опубликовать свой код здесьи я могу сказать, что это не очень сложно.

Надеюсь, это поможет.

1 голос
/ 29 октября 2010

Попробуйте это , похоже, это то, что вы ищете. Просто пропустите все после:

TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, ref w); //your width
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, ref h); //your height
TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, ref bits);
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, ref samples);

Не забудьте закрыть после вас:

TIFFClose(tif);
...