フレームを表示

L_ReadFileTags

フレームを表示

#include "l_bitmap.h"

L_LTFIL_API L_INT L_ReadFileTagspszFile、uFlags、puTagCount、ppTags、puDataSize、ppData、pLoadOptions

L_TCHAR * pszFile;

/* 入力ファイル名*/

L_UINT uFlags;

/* 制御フラグ*/

L_UINT* puTagCount;

/* 見つけられる多くのタグ*/

pLEADFILETAG* ppTags;

/* タグデータのための変数のアドレス*/

L_SIZE_T* puDataSize;

/* タグデータの全体的なサイズ*/

L_UCHAR** ppData;

/* 全体的なタグデータ*/

pLOADFILEOPTION pLoadOptions;

/* オプションの拡張ロードオプションへのポインター*/

ファイルで保存されるすべてのタグを取得します。

パラメーター

説明

pszFile

入力ファイル名を格納する文字列。

uFlags

タグ全体的なデータを読むべきかどうかについて決定するフラグ。ビットごとのORを用いて適切なとき、値を結合することができます( | ):

 

フラグ

意味

 

READFILEMETADATA_NOMEMORY

[0x01]、タグ全体的なデータを読みません。このフラグが設定されるならば、puDataSizeppDataが使われません、そして、関数はタグ全体的なデータを読みません。

このフラグが設定されるならば、LEADFILETAG構造体のuDataOffsetメンバはタグのためにlData値で塗りつぶされます。これは、データが4バイト以上のデータでタグのために保存されるファイルにオフセットを取得するのに用いられることができます。

puTagCount

ファイルで見つけられるタグの数で更新される変数のアドレス。

ppTags

pLEADEADFILETAG構造体の配列へのポインター。配列の各々の要素は、ファイルで見つけられる1つのタグのために、データを格納します。ppTagsの要素数は、puTagCountです。この配列がもはや必要でないとき、割り当てられたメモリを開放するために、L_FreeFileTags関数にそれを渡します。

puDataSize

オーバーオールのバイトでサイズで更新される変数のアドレスは、データにタグを付けます。

ppData

オーバーオールへのポインターで更新される変数のアドレスは、データにタグを付けます。バイトのこのポインターのサイズは、puDataSizeです。見つけられる各々のLEADEADFILETAG項目は、この項目のためのデータがppDataで保存されるところに、オフセットを格納します。

pLoadOptions

オプションの拡張ロードオプションへのポインター。デフォルトのロードオプションを使うために、NULLを渡します

戻り値

SUCCESS

関数は成功しました。

<1

エラーが発生しました。リターンコードを参照してください

コメント

L_FreeFileTags関数を用いてこの関数で割り当てられるデータを開放しなければなりません。

TIFFタグについての一般情報については、TIFFコメントとタグの実装を参照します。

この関数は、SubIFDsに埋め込まれる読み取りタグに、非常に役立ちます。たとえば、MakerNote Exifタグは、SubIFDにオフセットを時々格納します。L_ReadFileTagsを用いてオフセットされて、READFILEMETADATA_NOMEMORYタグを渡しているSubIFDを取得することができます。オフセット値をLOADFILEOPTION.IFDに設定することによってIFDからデータを読むために得られるオフセットをその後使うことができます。MakerNoteデータタグが4より大きいカウントをするならば、時々、これがL_ReadFileTagを用いて可能でない点に注意します。サンプルのための下記に見えます。

必須のDLLとライブラリ

LTFIL

ツールキットバージョンに基づいた正確なDLLとライブラリのリストについては、「アプリケーションとともに配布するファイル」を参照してください

プラットホーム

Win32、x64、Linux

参照

関数:

L_SetTag, L_GetTag, L_ReadFileTag, L_FreeFileTags

トピック:

TIFFコメントとタグの実装

サンプル

これらのサンプルは、ファイルタグ、コメントとジオキーに対処します。

#define MAKE_IMAGE_PATH(pFileName) TEXT("C:\\Users\\Public\\Documents\\LEADTOOLS Images\\")pFileName


//Example 1: This example will read all the tags, comments and geo keys stored in a disk file.
L_LTFILTEX_API  L_INT ReadFileTagsExample1(L_VOID)
{
   FILEINFO fi;
   L_INT nRet;
   L_UINT i, uTagCount=0, uCommentCount=0, uGeoKeyCount=0;
   pLEADFILETAG pTags = NULL, pCurrentTag, pGeoKeys = NULL, pCurrentGeoKey;
   L_SIZE_T uTagDataSize = 0, uCommentDataSize = 0, uGeoKeyDataSize = 0;
   L_UCHAR *pTagData = NULL, *pCommentData = NULL, *pGeoKeyData = NULL;
   L_CHAR *pszAscii = NULL;
   pLEADFILECOMMENT pComments = NULL, pCurrentComment;
   L_TCHAR szImageFileName[L_MAXPATH] ;
   lstrcpy(szImageFileName,MAKE_IMAGE_PATH(TEXT("ImageProcessingDemo\\image1.jpg")));


   // Get the format of the file
   ZeroMemory(&fi, sizeof(FILEINFO));
   fi.uStructSize = sizeof(FILEINFO);
   nRet = L_FileInfo(szImageFileName, &fi, sizeof(FILEINFO), 0, NULL);
   if(nRet != SUCCESS)
      return nRet;

   // Read all the tags in the file
   if(nRet == SUCCESS && L_TagsSupported(fi.Format))
   {
      // Yes, read all the tags from the file
      nRet = L_ReadFileTags(
         szImageFileName,
         0,
         &uTagCount,
         &pTags,
         &uTagDataSize,
         &pTagData,
         NULL);
   }

   // Read all the comments in the file
   if(nRet == SUCCESS && L_CommentsSupported(fi.Format))
   {
      // Yes, read all the comments from the file
      nRet = L_ReadFileComments(
         szImageFileName,
         0,
         &uCommentCount,
         &pComments,
         &uCommentDataSize,
         &pCommentData,
         NULL);
   }

   // Read all the geo keys in the file
   if(nRet == SUCCESS && L_GeoKeysSupported(fi.Format))
   {
      // Yes, read all the geo keys from the file
      nRet = L_ReadFileGeoKeys(
         szImageFileName,
         0,
         &uGeoKeyCount,
         &pGeoKeys,
         &uGeoKeyDataSize,
         &pGeoKeyData,
         NULL);
   }

   if(nRet == SUCCESS)
   {
      if(uTagCount > 0)
      {
         // Show the tags
         wprintf(L"Tags\n");
         for(i = 0; i < uTagCount; i++)
         {
            pCurrentTag = &pTags[i];

            // If this tag is of type ASCII, get its data
            if(pCurrentTag->uType == TAG_ASCII)
            {
               pszAscii = (L_CHAR*)malloc(pCurrentTag->uDataSize + 1);
               ZeroMemory(pszAscii, pCurrentTag->uDataSize + 1);
               CopyMemory(pszAscii, pTagData + pCurrentTag->uDataOffset, pCurrentTag->uDataSize);
            }
            else
            {
               pszAscii = NULL;
            }

            printf("Id: 0x%X, data length: %u, data: %s\n", pCurrentTag->uTag, pCurrentTag->uDataSize, pszAscii != NULL ? pszAscii : "Binary data");
         }

         L_FreeFileTags(uTagCount, pTags, uTagDataSize, pTagData);
      }

      if(uCommentCount > 0)
      {
         // Show the Comments
         wprintf(L"Comments\n");
         for(i = 0; i < uCommentCount; i++)
         {
            pCurrentComment = &pComments[i];

            // If this comment is of type ASCII, get its data
            printf("Id: 0x%X, data length: %u\n", pCurrentComment->uType, pCurrentComment->uDataSize);
         }

         L_FreeFileComments(uCommentCount, pComments, uCommentDataSize, pCommentData);
      }

      if(uGeoKeyCount > 0)
      {
         // Show the geo keys
         wprintf(L"GeoKeys\n");
         for(i = 0; i < uGeoKeyCount; i++)
         {
            pCurrentGeoKey = &pGeoKeys[i];

            // If this geo key is of type ASCII, get its data
            if(pCurrentGeoKey->uType == TAG_ASCII)
            {
               pszAscii = (L_CHAR*)malloc(pCurrentGeoKey->uDataSize + 1);
               ZeroMemory(pszAscii, pCurrentGeoKey->uDataSize + 1);
               CopyMemory(pszAscii, pGeoKeyData + pCurrentGeoKey->uDataOffset, pCurrentGeoKey->uDataSize);
            }
            else
            {
               pszAscii = NULL;
            }

            printf("Id: 0x%X, data length: %u, data: %s\n", pCurrentGeoKey->uTag, pCurrentGeoKey->uDataSize, pszAscii != NULL ? pszAscii : "Binary data");
         }

         L_FreeFileTags(uGeoKeyCount, pGeoKeys, uGeoKeyDataSize, pGeoKeyData);
      }
   }
   return SUCCESS;
}

//Example 2: This example will read a custom tag contained inside a Canon MakerNote tag. The Canon MakerNote tag contains an offset into a SubIFD containing Canon-specific tags. You can do a web search for "canon makernote specification" to get the details on the Canon Makernote tag.
L_LTFILTEX_API L_INT ReadCanonSerialNumber2(HWND hWnd, TCHAR *pszFile)
{
   // read the MakerNote tag
   // Step1: Find the ExifIFD tag offset
   L_UINT16 uType = TAG_LONG;
   L_UINT   uCount = 1;
   L_INT    nExifIFDOffset;
   L_INT    nTagSize = L_ReadFileTag(pszFile, 0x8769, &uType, &uCount, &nExifIFDOffset, NULL);

   if(nTagSize != 4)
      return -5000; // custom error: this file is not an Exif file

   // set up the LOADFILEOPTION structure to read tags from the Exif IFD
   LOADFILEOPTION LoadFileOption;
   L_GetDefaultLoadFileOption(&LoadFileOption, sizeof(LoadFileOption));
   LoadFileOption.IFD = nExifIFDOffset;
   LoadFileOption.Flags = ELO_USEIFD;

   // step2: Find the offset of the MakerNote tag. Use L_EnumFileTags instead of L_ReadFileTag
   //        because it is the only way to get the offset value for a tag with more than 4 bytes
   L_UINT uTags;
   LEADFILETAG *pTags;
   L_INT nRet = L_ReadFileTags(pszFile, READFILEMETADATA_NOMEMORY, &uTags, &pTags, NULL, NULL, &LoadFileOption);
   if(nRet != SUCCESS)
      return nRet;

   for(UINT u = 0; u < uTags; u++)
   {
      if(pTags[u].uTag == 0x927C) // makernote tag
      {
         // read the makernote tags
         LoadFileOption.IFD = pTags[u].uDataOffset;

         // The Canon Makernote tags lists the Camera Serial number 
         // 12    Camera Serial Number    Special - To display serial number as on camera use: printf( "%04X%05d", highword, lowword )
         nTagSize = L_ReadFileTag(pszFile, 12, &uType, &uCount, NULL, &LoadFileOption);

         if(nTagSize == 4)
         {
            L_UINT uSerialNumber;
            nTagSize = L_ReadFileTag(pszFile, 12, &uType, &uCount, &uSerialNumber, &LoadFileOption);
            if(nTagSize == 4)
            {
               TCHAR s[50];
               _stprintf_s(s, _countof(s), TEXT("%04X%05d"), HIWORD(uSerialNumber), LOWORD(uSerialNumber));
               MessageBox(hWnd, s, TEXT("Serial Number"), MB_OK);
            }
         }
         L_FreeFileTags(uTags, pTags, 0, NULL);

         return SUCCESS;
      }
   }

   L_FreeFileTags(uTags, pTags, 0, NULL);

   return -5001; // custom error: did not find the tag
}