В интересах полного раскрытия я работаю в Atalasoft.
Из-за этого поста к нам обратилась компания, и я хотел бы помочь как можно большему числу людей, которые могут столкнуться с той же проблемой.
У компании были файлы, которые внутренне идентифицируются какбыть PIXTIFF.Конкретной присутствующей строкой были «Pixel Translations Inc., версия PIXTIFF» и номер версии.Однако эти файлы имели несколько сотен байтов до заголовка TIFF, что делало их невозможными для открытия в стандартных средствах просмотра.
Я нашел другой набор файлов, когда искал допустимые TIFF для ссылки с той же строкой PIXTIFF, которая былауже работающий tiff.Я не могу сказать, был ли кто-то уже «исправлен» или если нестандартный процесс создал набор, который имел эта компания.
Итак, если вы обнаружите, что у вас есть эти двоичные файлы PIXTIFF, сначала проверьте, недействительны, прежде чем продолжить.Сделайте копию, дайте ей расширение .tif и используйте что-то вроде IrfanView , чтобы попытаться открыть ее.
Просмотр спецификации заголовка Tiff : файлы Tiff начинаются с II* (0x49 0x49 0x2A 0x00) или MM * (0x4D 0x4D 0x2A 0x00), а затем смещение к первому каталогу изображений с начала файла.(Хотя в моем опыте порядок ММ с прямым порядком байтов редок.)
Указанные файлы можно было исправить, удалив все данные до заголовка tiff.Смещения были уже правильными относительно заголовка TIFF.
Я включил быстрый пример C # того, что я делал для этого локально.Это должно быть довольно просто, чтобы это произошло на выбранном вами языке.
Примечание: Stream.CopyTo доступен только в .Net 4.0 и более поздних версиях. Это также исправляет только одиниз двух возможных заголовков, но он исправил все файлы под рукой.
byte[] header = { 0x49, 0x49, 0x2A, 0x00 };
int found = 0;
string filename = @"fileToFix";
using (Stream fileToFix = File.OpenRead(filename))
{
while (found < 4 && fileToFix.Position < fileToFix.Length)
{
if (header[found] == fileToFix.ReadByte())
found++;
else
found = 0;
}
if (found != 4) //Didn't find a tiff.
return;
fileToFix.Seek(-4, SeekOrigin.Current); //We're already 4 bytes in the the header, go back.
using (Stream fixedFile = File.OpenWrite(Path.Combine(Path.GetDirectoryName(filename), Path.GetFileNameWithoutExtension(filename) + ".fixed.tif"))) //Same directory, same name but ending in .fixed.tif.
fileToFix.CopyTo(fixedFile);
}