Похоже, вы уже используете PIL и Python 3.x, но не уверены, что хотите продолжать использовать piexif
, но в любом случае вам может оказаться проще сначала преобразовать градусы, минуты и секунды в десятичную. Похоже, вы уже пытаетесь это сделать, но если поместить это в отдельную функцию, это может быть более понятным и учитывает направление.
Вот пример:
def get_decimal_from_dms(dms, ref):
degrees = dms[0][0] / dms[0][1]
minutes = dms[1][0] / dms[1][1] / 60.0
seconds = dms[2][0] / dms[2][1] / 3600.0
if ref in ['S', 'W']:
degrees = -degrees
minutes = -minutes
seconds = -seconds
return round(degrees + minutes + seconds, 5)
def get_coordinates(geotags):
lat = get_decimal_from_dms(geotags['GPSLatitude'], geotags['GPSLatitudeRef'])
lon = get_decimal_from_dms(geotags['GPSLongitude'], geotags['GPSLongitudeRef'])
return (lat,lon)
geotags
в этом примере представляет собой словарь с GPSTAGS в качестве ключей вместо цифровых кодов для удобства чтения. Вы можете найти более подробную информацию и полный пример из этого поста в блоге: Начало работы с геокодированием Exif Image Metadata в Python 3
На самом деле ответ vbcrlfuser мне помог, но код был не совсем корректным для текущей версии BitMiracle.LibTiff.NET, так как я мог его скачать. В текущей версии эквивалентный код выглядит следующим образом:
using iTextSharp.text.pdf;
using BitMiracle.LibTiff.Classic;
...
Tiff tiff = Tiff.Open("C:\\test.tif", "w");
tiff.SetField(TiffTag.IMAGEWIDTH, UInt32.Parse(pd.Get(PdfName.WIDTH).ToString()));
tiff.SetField(TiffTag.IMAGELENGTH, UInt32.Parse(pd.Get(PdfName.HEIGHT).ToString()));
tiff.SetField(TiffTag.COMPRESSION, Compression.CCITTFAX4);
tiff.SetField(TiffTag.BITSPERSAMPLE, UInt32.Parse(pd.Get(PdfName.BITSPERCOMPONENT).ToString()));
tiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);
tiff.WriteRawStrip(0, raw, raw.Length);
tiff.Close();
Используя приведенный выше код, я наконец получил действительный файл Tiff в C: \ test.tif. Спасибо, vbcrlfuser!
Эта библиотека ... http://www.bitmiracle.com/libtiff/ и этот пример ниже должен помочь вам на 99% пути
string filter = pd.Get(PdfName.FILTER).ToString();
string width = pd.Get(PdfName.WIDTH).ToString();
string height = pd.Get(PdfName.HEIGHT).ToString();
string bpp = pd.Get(PdfName.BITSPERCOMPONENT).ToString();
switch (filter)
{
case "/CCITTFaxDecode":
byte[] data = PdfReader.GetStreamBytesRaw((PRStream)pdfStream);
int tiff = TIFFOpen("example.tif", "w");
TIFFSetField(tiff, (uint)BitMiracle.LibTiff.Classic.TiffTag.IMAGEWIDTH,(uint)Int32.Parse(width));
TIFFSetField(tiff, (uint)BitMiracle.LibTiff.Classic.TiffTag.IMAGEHEIGHT, (uint)Int32.Parse(height));
TIFFSetField(tiff, (uint)BitMiarcle.LibTiff.Classic.TiffTag.COMPRESSION, (uint)BitMiracle.Libtiff.Classic.Compression.CCITTFAX4);
TIFFSetField(tiff, (uint)BitMiracle.LibTiff.Classic.TiffTag.BITSPERSAMPLE, (uint)Int32.Parse(bpp));
TIFFSetField(tiff, (uint)BitMiarcle.Libtiff.Classic.TiffTag.SAMPLESPERPIXEL,1 );
IntPtr pointer = Marshal.AllocHGlobal(data.length);
Marshal.copy(data, 0, pointer, data.length);
TIFFWriteRawStrip(tiff, 0, pointer, data.length);
TIFFClose(tiff);
break;
break;
}