#pragma rtGlobals=3 // Use modern global access method and strict wave access. Function FunLoadTIFFile(sPathName,sFileName) string sPathName string sFileName Variable vRefNum string sMessage="Select a TIFF file" string sFileFilter="TIFF files (*.tif):.tif;All Files:.*;" Open/R/Z=2/F=sFileFilter/P=$sPathName/M=sMessage vRefNum as sFileName // Keep outputs from open variable vErr=V_flag string sFullName=S_fileName if (vErr == -1) return -1 // User cancelled. endif if (vErr != 0) return vErr endif Printf "Loading data from \"%s\"\r", sFullName string sDataLine,sRE do // TIFF: FStatus vRefNum variable vFileLength=V_logEOF if(vFileLength<9) print "Error: not a TIFF file." break endif string sData=" " // 2 characters FBinRead vRefNum, sData variable vByteOrder=-1 if(cmpStr(sData,"II")==0) vByteOrder=3 // Intel/Windows little endian elseif(cmpStr(sData,"MM")==0) vByteOrder=2 // Motorola/Macintosh big endian endif if(vByteOrder==-1) print "Error: not a TIFF file." break endif variable vData FBinRead/U/B=(vByteOrder)/F=2 vRefNum, vData // 16-bit word if(vData!=42) print "Error: not a TIFF file." break endif FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vData // 32-bit word if(vFileLength600) FunGetTIFFFieldData(wIFD[vDE][%FieldType][vIFD],NaN,wIFD[vDE][%TAGOffset][vIFD],vByteOrder,sFieldType,sFieldData) sText+="~ "+sFieldType+","+num2str(wIFD[vDE][%OffsetValue][vIFD]) else FunGetTIFFFieldData(wIFD[vDE][%FieldType][vIFD],vRefNum,wIFD[vDE][%TAGOffset][vIFD],vByteOrder,sFieldType,sFieldData) sText+=sFieldType+"="+sFieldData endif print sText endfor endfor break while(1) Close vRefNum // Close the file // uncomment here to load the file // if(vErr==0) // ImageLoad/Q/O/T=tiff/RAT/G sFullName // print "Loading complete." // endif return vErr // Zero signifies no error. End Function FunGetTIFFFieldData(vFieldType,vRefNum,vTagOffset,vByteOrder,sFieldType,sFieldData) variable vFieldType variable vRefNum variable vTagOffset variable vByteOrder string &sFieldType string &sFieldData // returns field type and data from Filed ID for TIFF files // if vRefNum=NaN or not open file, just returns FieldType variable vReturnFlag=1 sFieldType="" sFieldData="" variable vData,vData2,vCount,i do FStatus vRefNum variable vSkipReadData=(V_flag==0) // keep flag logic switch(vFieldType) // FieldType case 1: // BYTE sFieldType="BYTE" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>4) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 2: // ASCII sFieldType="ASCII" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>4) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i2) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 4: // LONG sFieldType="LONG" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>1) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 5: // RATIONAL sFieldType="RATIONAL" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData)+"/"+num2str(vData2) endfor break case 6: // SBYTE sFieldType="BYTE" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>4) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 7: // UNDEFINED sFieldType="UNDEFINED" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>4) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 8: // SSHORT sFieldType="SSHORT" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>2) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 9: // SLONG sFieldType="SLONG" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>1) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break case 10: // SRATIONAL sFieldType="SRATIONAL" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData)+"/"+num2str(vData2) endfor break case 11: // FLOAT sFieldType="FLOAT" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) if(vCount>1) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) endif for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor case 11: // DOUBLE sFieldType="DOUBLE" if(vSkipReadData) break endif FSetPos vRefNum,vTagOffset+4 FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vCount // 32-bit word - Count FSetPos vRefNum, (vTagOffset+8) FBinRead/U/B=(vByteOrder)/F=3 vRefNum, vTagOffset FSetPos vRefNum, (vTagOffset) for(i=0;i0) sFieldData+="," endif sFieldData+=num2str(vData) endfor break endSwitch break while(1) return vReturnFlag End Function/S FunGetTIFFTAG(vTAG) variable vTAG // gets label for given TAG string sText="" switch(vTAG) // TAG case 254: // NewSubfileType sText="NewSubfileType" break case 255: // Subfiletype sText="Subfiletype" break case 256: // ImageWidth sText="ImageWidth" break case 257: // ImageLength sText="ImageLength" break case 258: // BitsPerSample sText="BitsPerSample" break case 259: // Compression sText="Compression" break case 262: // PhotometricInterpretation sText="PhotometricInterpretation" break case 263: // Threshholding sText="Threshholding" break case 264: // CellWidth sText="CellWidth" break case 265: // CellLength sText="CellLength" break case 266: // FillOrder sText="FillOrder" break case 269: // DocumentName sText="DocumentName" break case 270: // ImageDescription sText="ImageDescription" break case 271: // Make sText="Make" break case 272: // Model sText="Model" break case 273: // StripOffsets sText="StripOffsets" break case 274: // Orientation sText="Orientation" break case 277: // SamplesPerPixel sText="SamplesPerPixel" break case 278: // RowsPerStrip sText="RowsPerStrip" break case 279: // StripByteCounts sText="StripByteCounts" break case 280: // MinSampleValue sText="MinSampleValue" break case 281: // MaxSampleValue sText="MaxSampleValue" break case 282: // XResolution sText="XResolution" break case 283: // YResolution sText="YResolution" break case 284: // PlanarConfiguration sText="PlanarConfiguration" break case 285: // PageName sText="PageName" break case 286: // XPosition sText="XPosition" break case 287: // YPosition sText="YPosition" break case 288: // FreeOffsets sText="FreeOffsets" break case 289: // FreeByteCounts sText="FreeByteCounts" break case 290: // GrayResponseUnit sText="GrayResponseUnit" break case 291: // GrayResponseCurve sText="GrayResponseCurve" break case 292: // T4Options sText="T4Options" break case 293: // T6Options sText="T6Options" break case 296: // ResolutionUnit sText="ResolutionUnit" break case 297: // PageNumber sText="PageNumber" break case 301: // TransferFunction sText="TransferFunction" break case 305: // Software sText="Software" break case 306: // DateTime sText="DateTime" break case 315: // Artist sText="Artist" break case 316: // HostComputer sText="HostComputer" break case 317: // Predictor sText="Predictor" break case 318: // WhitePoint sText="WhitePoint" break case 319: // PrimaryChromaticities sText="PrimaryChromaticities" break case 320: // ColorMap sText="ColorMap" break case 321: // HalftoneHints sText="HalftoneHints" break case 322: // TileWidth sText="TileWidth" break case 323: // TileLength sText="TileLength" break case 324: // TileOffsets sText="TileOffsets" break case 325: // TileByteCounts sText="TileByteCounts" break case 332: // InkSet sText="InkSet" break case 333: // InkNames sText="InkNames" break case 334: // NumberOfInks sText="NumberOfInks" break case 336: // DotRange sText="DotRange" break case 337: // TargetPrinter sText="TargetPrinter" break case 338: // ExtraSamples sText="ExtraSamples" break case 339: // SampleFormat sText="SampleFormat" break case 340: // SMinSampleValue sText="SMinSampleValue" break case 341: // SMaxSampleValue sText="SMaxSampleValue" break case 342: // TransferRange sText="TransferRange" break case 512: // JPEGProc sText="JPEGProc" break case 513: // JPEGInterchangeFormat sText="JPEGInterchangeFormat" break case 514: // JPEGInterchangeFormatLngth sText="JPEGInterchangeFormatLngth" break case 515: // JPEGRestartInterval sText="JPEGRestartInterval" break case 517: // JPEGLosslessPredictors sText="JPEGLosslessPredictors" break case 518: // JPEGPointTransforms sText="JPEGPointTransforms" break case 519: // JPEGQTables sText="JPEGQTables" break case 520: // JPEGDCTables sText="JPEGDCTables" break case 521: // JPEGACTables sText="JPEGACTables" break case 529: // YCbCrCoefficients sText="YCbCrCoefficients" break case 530: // YCbCrSubSampling sText="YCbCrSubSampling" break case 531: // YCbCrPositioning sText="YCbCrPositioning" break case 532: // ReferenceBlackWhite sText="ReferenceBlackWhite" break case 33432: // Copyright sText="Copyright" break default: sText="TAG:"+num2str(vTAG)+" " endSwitch return sText End