2012-11-27 64 views
6

私のプログラムから複数のTIFFを保存する必要がありますが、Qt doesn't support multipage TIFFと思われます。それでも、私はそれをする必要があります。私のプログラムからそれをやり遂げる最善の方法は何でしょうか?Qt複数のTIFF

ImageMagickのコマンドラインユーティリティを使用して、作成した多くのJPEGファイルからマルチページTIFFを作成したり、プロジェクトにlibtiffを追加したり、プロジェクトを使用しようとしたり、GDI +を使用しようと考えています(Windowsでは少なくとも) TIFFを生成する。

私が逃したかもしれない他のアイデア?

可能であれば外部EXEまたはDLLを使用しないでください。つまり、プロジェクトのソースコードにライブラリを直接追加することができれば最適です。

また、既に完了しているプロジェクトが分かっている場合は、リンクを投稿してください。車輪を再構築したくないです。

答えて

5

Qtはlibtiffを使用してTIFFを読み書きします。だから私は同じライブラリを使用し、頭痛はほんの少しです。第二に、http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/image/qtiffhandler.cppを見て、Qtが1つのQImageを書く方法の手がかりを得てください。複数のページをサポートするには、TIFFSetField()here、TIFFTAG_PAGENAME、TIFFTAG_PAGENUMBERを参照)を使用する必要があると思います。私はwrite() functionを展開または類似した何かを書く、どこのいずれかに開始する。)

  • TIFFClientOpen(;
  • QImages
    • のリストを超える反復は、(物事QTiffHandler ::書き込みを行うQImageの
    • ごと
    • をページを設定)TIFFClose()
  • を行います。

も参照してください。http://code.google.com/p/multiphoton/source/browse/MatroxImagingLibrary.cpp?#1628

+0

素晴らしい!私はQtが既にlibtiffを使用しているのを知らなかった。それにはどうしたらいいですか? '#include 'tiffioを追加するだけです。 – sashoalm

+0

libtiffは 'src/3rdparty/libtiff/libtiff'フォルダにあります。どのように組み込むかはあなたとあなたのプロジェクト構造に少しあります。 – akira

+0

私はQtは既にlibtiffにリンクしているので、自分のプロジェクトにインポートすることなくlibtiffを使用することはできませんでした。Qtが構築しているヘッダファイルとlibファイルを使用します。私のプログラム。 – sashoalm

6

は似たようなトピックに関する私の情報を追加したいです。最新(4.0.3)のソースからlibTiffをビルドしました。私のプロジェクトは、すべてのx64であるが、それはかなり簡単だった:x64のため

  1. ダウンロードして解凍しますlibtiffのソース(何か)
  2. オープンVS2010(またはX32が)から、あなたの解凍したフォルダに
  3. CDをcmdをステップ1
  4. タイプ:NMAKE/F makefile.vc
  5. libtiffのフォルダ/からファイルを取得し、あなたのプロジェクトに

を追加するには、ここでは16ビットの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); 
} 

出典:VSから ビルのlibtiff - http://www.remotesensing.org/libtiff/build.html#PC

例マルチページTIFF - http://www.remotesensing.org/libtiff/libtiff.html

その他。 Tiffマニュアル - http://www.remotesensing.org/libtiff/man/

関連する問題