Извлечение изображения от PDF с фильтром/CCITTFaxDecode

Похоже, вы уже используете 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

17
задан Bobrovsky 9 December 2011 в 10:46
поделиться

2 ответа

На самом деле ответ 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!

16
ответ дан 30 November 2019 в 12:35
поделиться

Эта библиотека ... 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;

}
8
ответ дан 30 November 2019 в 12:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: