6

プログラムからマルチページ TIFF を保存する必要がありますが、Qt はマルチページ TIFF をサポートしていないようです。それでも、私はそれをする必要があります。私のプログラムからそれを行うための最良の方法は何でしょうか?

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

私が見逃したかもしれない他のアイデアはありますか?

可能であれば、外部の EXE や DLL の使用を避けたいと考えています。つまり、ライブラリをプロジェクトのソース コードに直接追加できるのであれば、それが最適です。

また、すでに完了しているプロジェクトを知っている場合は、リンクを投稿してください。車輪の再発明はしたくありません。

4

2 に答える 2

6

同様のトピックに関する情報を追加したかっただけです。最終的に、最新 (4.0.3) のソースから libTiff をビルドするだけになりました。私のプロジェクトはすべて x64 ですが、とても簡単でした。

  1. libTIFF ソースをダウンロードして解凍する
  2. x64(またはx32)コマンドのVS2010(または何でも)を開きます
  3. 手順 1 で解凍したフォルダーに cd します。
  4. タイプ: nmake /f makefile.vc
  5. /libtiff フォルダーからファイルを取得し、プロジェクトに追加します。

16 ビット TIFF データを読み取る例を次に示します。

    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/

于 2013-06-25T18:11:10.323 に答える
4

Qt はlibtiffを使用して TIFF の読み取りと書き込みを行います。したがって、同じライブラリを使用しますが、頭痛が少なくなります。次に、http://qt.gitorious.org/qt/qt/blobs/4.8/src/gui/image/qtiffhandler.cpp を見て、Qt が 1 つのQImageを書き込む方法の手がかりを得てください。複数のページをサポートするには、使用する必要があると思いますTIFFSetField()(こちら、TIFFTAG_PAGENAME および TIFFTAG_PAGENUMBER を参照)。write() 関数を展開するか、似たようなものを書き始めます。

  • TIFFClientOpen();
  • QImages のリストを反復処理する
    • QImageごとにページを設定する
    • QTiffHandler::write() が行うことを行う
  • TIFFClose();

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

于 2012-11-27T08:51:35.990 に答える