2012-11-27 20 views
6

Ho bisogno di salvare un TIFF multipagina dal mio programma, ma sembra Qt doesn't support multipage TIFF. Eppure, ho bisogno di farlo. Quale sarebbe il modo migliore per farlo nel mio programma?Qt multipagina TIFF

Finora, sto pensando di usare utilità della riga di comando di ImageMagick per creare il TIFF multipagina da più file JPEG creo, o l'aggiunta di libtiff al mio progetto e cercando di usarlo, o utilizzando GDI + (su Windows, almeno) per generare il TIFF.

Altre idee che potrei aver perso?

Vorrei evitare l'uso di EXE o DLL esterni, se possibile, ad esempio se posso aggiungere una libreria direttamente al codice sorgente del mio progetto, sarebbe meglio.

Inoltre, se si è a conoscenza di un progetto in cui è già stato eseguito, si prega di inserire un collegamento ad esso, preferirei non reinventare la ruota.

risposta

5

Qt utilizza libtiff per leggere e scrivere TIFF. Quindi userei la stessa libreria, solo meno mal di testa. Secondo: guarda http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/image/qtiffhandler.cpp per avere un'idea di come Qt scrive un QImage. Per supportare più pagine, penso che sia necessario utilizzare TIFFSetField() (vedere here, TIFFTAG_PAGENAME e TIFFTAG_PAGENUMBER). Vorrei iniziare a espandere il write() function o scrivere qualcosa di simile, dove:

  • TIFFClientOpen();
  • iterare su una lista di QImages
    • impostare la pagina per QImage
    • fare le cose QTiffHandler :: write() fa
  • TIFFClose();

vedi anche: http://code.google.com/p/multiphoton/source/browse/MatroxImagingLibrary.cpp?#1628

+0

Grande! Non sapevo che Qt utilizza già la libtiff. Come posso arrivarci? Aggiungendo semplicemente "#include" tiffio.h "' non mi dà 'nessun file o directory'. – sashoalm

+0

libtiff può essere trovato nella cartella' src/3rdparty/libtiff/libtiff'. come includerlo è un po 'su di te e sulla struttura del tuo progetto. – akira

+0

Mi chiedevo se dato che Qt si collega già a libtiff, non potrei usare libtiff senza importarlo nel mio progetto, piuttosto, userei le intestazioni e i file lib con cui è costruito Qt. Ma forse quelle intestazioni e file lib non sono accessibili per il mio programma – sashoalm

6

Volevo solo aggiungere il mio informazioni su un argomento simile. Ho finito con la creazione di libTiff dall'ultima (4.0.3) fonte. Il mio progetto è tutto in x64, ma è stato abbastanza facile:

  1. Scaricare e decomprimere libTIFF fonte
  2. Aprire il VS2010 (o qualsiasi altra cosa) per x64 (o x32) cmd
  3. cd alla cartella decompresso da fase 1
  4. tipo: nmake/f makefile.vc
  5. recuperare i file dalla cartella/libtiff e aggiungere al progetto

Ecco un esempio di lettura di 16 bit TIFF d ata:

TIFF *MultiPageTiff = TIFFOpen("C:\\MultiPageTiff.tif", "r"); 

std::vector<unsigned short*> SimulatedQueue; 

//Read First TIFF to setup the Buffers and init 
//everything 
int Width, Height; 
//Bit depth, in bits 
unsigned short depth; 

TIFFGetField(MultiPageTiff, TIFFTAG_IMAGEWIDTH, &Width); 
TIFFGetField(MultiPageTiff, TIFFTAG_IMAGELENGTH, &Height); 
TIFFGetField(MultiPageTiff, TIFFTAG_BITSPERSAMPLE, &depth); 

//This should be Width*(depth/sizeof(char)) 
tsize_t ScanlineSizeBytes = TIFFScanlineSize(MultiPageTiff); 

if(MultiPageTiff){ 
    int dircount = 0; 
    do{ 
     dircount++; 

     //I'm going to be QQueue'ing these up, so a buffer needs to be 
     //allocated per new TIFF page 
     unsigned short *Buffer = new unsigned short[Width*Height]; 

     //Copy all the scan lines 
     for(int Row = 0; Row < Height; Row++){ 
      TIFFReadScanline(MultiPageTiff, &Buffer[Row*Width], Row, 0); 
     } 

     SimulatedQueue.push_back(Buffer); 

    }while(TIFFReadDirectory(MultiPageTiff)); 

    TIFFClose(MultiPageTiff); 
} 

Fonti: costruzione libtiff da VS - http://www.remotesensing.org/libtiff/build.html#PC

Esempio multipagina TIFF - http://www.remotesensing.org/libtiff/libtiff.html

Varie. Tiff Manuals - http://www.remotesensing.org/libtiff/man/