dibtiff.cpp
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:18k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. // dibtif.cpp
  2. //
  3. #include "stdafx.h"
  4. #include "dibtiff.h"
  5. #include <math.h>
  6. #include "tiffio.h"
  7. #include "geotiffio.h"
  8. #include "geo_normalize.h"
  9. #include "geo_tiffp.h"
  10. //#include "geoproj.h"
  11. #include <string>
  12. #include <UtilProcess.h>
  13. #include <UtilityParser.h>
  14. #include <StringUtil.h>
  15. using namespace std;
  16. extern char * GetInitialFolder(void);
  17. #define ROUND(x)    (u_short) ((x) + 0.5)
  18. #define TIFF_GAMMA  2.2
  19. void ConvertToPDF(const char * tiffName, const char * pdfName)
  20. {
  21. const char * args[4];
  22. args[0] = "tiff2pdf";
  23. args[1] = "-o";
  24. args[2] = pdfName;
  25. args[3] = tiffName;
  26. string cmd = "tiff2pdf -o ";
  27. cmd += pdfName;
  28. cmd += " ";
  29. cmd += tiffName;
  30. //system(cmd.c_str());
  31. UtilProcess p;
  32. p.CreateProcess("tiff2pdf.exe", cmd.c_str(), false);
  33. }
  34. int ReadTIFFDirectories(const char * filename, ArrayContainer<TIFFSubImage>& images)
  35. {
  36. int result = 0;
  37. TIFF * tiff = TIFFOpen((char *)filename,"r");
  38. if (tiff)
  39. {
  40. int m_num_items = TIFFNumberOfDirectories(tiff);
  41. if (m_num_items > 0)
  42. {
  43. for (int i=0;i<m_num_items;i++){
  44. tdir_t d = (tdir_t)i;
  45. TIFFSetDirectory(tiff,d);
  46. int w=0, h=0;
  47. int bpp = 0;
  48. char name[256];
  49. memset(name,0,(size_t)256);
  50. sprintf(name,"image%d",i);
  51.   // 2)
  52.   // Get the width and height of the image
  53. TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH, &w);
  54. TIFFGetField(tiff,TIFFTAG_IMAGELENGTH, &h);
  55. TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bpp);
  56. TIFFSubImage ti(w,h,i,bpp,name);
  57. if (ti.IsCreated())
  58. {
  59. images.AddElement(ti);
  60. result++;
  61. }
  62. }
  63. }
  64. TIFFClose(tiff);
  65. }
  66. return result;
  67. }
  68. void RGBA_to_BGRA(BYTE* data,int width,int height)
  69. {
  70.   int   i;
  71.   int   j;
  72.   int   line_width;
  73.   BYTE  r, g, b, a;
  74.   BYTE* ptr;
  75.   ptr = data;
  76.   line_width = width * 4;
  77.   for(i = 0; i < height; i++)
  78.   {
  79.     ptr = data + line_width*i;
  80.     for(j = 0; j < width; j++)
  81.     {
  82.       r = ptr[0];
  83.       g = ptr[1];
  84.       b = ptr[2];
  85.       a = ptr[3];
  86.       ptr[2] = (BYTE)( (r*a+1) >> 8 );
  87.       ptr[1] = (BYTE)( (g*a+1) >> 8 );
  88.       ptr[0] = (BYTE)( (b*a+1) >> 8 );
  89.       ptr += 4;
  90.     }
  91.   }
  92.   return;
  93. }
  94. void BGRA_to_RGBA(BYTE* data,int width,int height, int pad)
  95. {
  96.   int   i;
  97.   int   j;
  98.   int   line_width;
  99.   BYTE  r, g, b, a;
  100.   BYTE* ptr;
  101.   ptr = data;
  102.   line_width = width * 4;
  103.   for(i = 0; i < height; i++)
  104.   {
  105.     ptr = data + line_width*i;
  106.     for(j = 0; j < width; j++)
  107.     {
  108.       b = ptr[0];
  109.       g = ptr[1];
  110.       r = ptr[2];
  111.       a = ptr[3];
  112.       ptr[0] = r;
  113.       ptr[1] = g;
  114.       ptr[2] = b;
  115.       ptr += 4;
  116.     }
  117.   }
  118.   return;
  119. }
  120. int OpenTIFF2DIB(const char * filename, DIBSection& dib, int directory)
  121. {
  122. int result = 0;
  123. TIFF * tiff = TIFFOpen((char *)filename,"r");
  124. if (tiff)
  125. {
  126. int w=0, h=0;
  127. tdir_t d = (tdir_t)directory;
  128. TIFFSetDirectory(tiff,d);
  129. TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH, &w);
  130. TIFFGetField(tiff,TIFFTAG_IMAGELENGTH, &h);
  131. if ((w > 0) && (h > 0))
  132. {
  133. UINT32 * raster = new UINT32[(w*h)];
  134. if (raster)
  135. {
  136. dib.Create(w,h,24);
  137. UINT32 tw = dib.GetTotalWidth();
  138. if (TIFFReadRGBAImage(tiff, w, h, (unsigned long *)raster, 0))
  139. {
  140. RGBA_to_BGRA((BYTE *)raster,w,h);
  141. unsigned char * dest = (unsigned char *)dib.GetBits();
  142. unsigned char * src = (unsigned char *)raster;
  143. unsigned char * ptr_dest;
  144. unsigned char * ptr_src;
  145. int row, col;
  146. for (row=0; row < h; row++){
  147. ptr_dest = dest + row * tw * 3;
  148. ptr_src = src + row * w * 4;
  149. for (col=0; col < w; col++){
  150. memcpy(ptr_dest,ptr_src,3);
  151. ptr_dest += 3;
  152. ptr_src += 4;
  153. }
  154. }
  155. result++;
  156. }
  157. delete [] raster;
  158. }
  159. }
  160. TIFFClose(tiff);
  161. GEORef gr;
  162. if (ReadGeoInfo(filename,gr))
  163. {
  164. gr.m_rows = h;
  165. gr.m_cols = w;
  166. dib.SetGeoReference(gr);
  167. }
  168. }
  169. return result;
  170. }
  171. bool ReadGeoInfo(const char * filename, GEORef& gr)
  172. {
  173. bool result = false;
  174. TIFF * tiff = 0;
  175. GTIF * gtif = 0;
  176. tiff = XTIFFOpen(filename,"r");
  177. if (tiff)
  178. {
  179. gtif = GTIFNew(tiff);
  180. if (gtif)
  181. {
  182. const int key_size = 2048;
  183. char key_data[key_size];
  184. memset(key_data,0,(size_t)key_size);
  185. tagtype_t cit_type;
  186. int cit_size;
  187. INT32 ellps = 1;
  188. string geoCitationKey;
  189. double * d_list = 0;
  190. int d_list_count = 0;
  191. int cit_len = GTIFKeyInfo(gtif,GTCitationGeoKey, &cit_size, &cit_type);
  192. if (cit_len)
  193. {
  194. if (GTIFKeyGet(gtif,GTCitationGeoKey,key_data,0,cit_len))
  195. {
  196. geoCitationKey = (char *)key_data;
  197. }
  198. }
  199. if (geoCitationKey.length() == 0)
  200. {
  201. char * gt_ascii = 0;
  202. if (TIFFGetField(tiff, GTIFF_ASCIIPARAMS, &gt_ascii))
  203. {
  204. geoCitationKey = (char *)gt_ascii;
  205. }
  206. }
  207. if (geoCitationKey.length() > 0)
  208. {
  209. UtilityParser p;
  210. p.ParseString(geoCitationKey);
  211. if (p.GetSize() > 0)
  212. {
  213. vector<string> * pArgs = p.GetData();
  214. UINT32 argSize = pArgs->size();
  215. bool utmproj = false;
  216. for (UINT32 i = 0; i < argSize; i++){
  217. string iArg = (*pArgs)[i];
  218. StringUtil::Uppercase(iArg);
  219. if (iArg == "UTM")
  220. {
  221. utmproj = true;
  222. }
  223. if (utmproj && StringUtil::IsIntNumber(iArg))
  224. {
  225. gr.m_proj = GEORef::UTM;
  226. gr.m_zone = atoi(iArg.c_str());
  227. gr.m_ellipse = GEORef::Clarke1866;
  228. result = true;
  229. }
  230. if ((iArg == "ZONE") && (i < (argSize-1)) && (utmproj))
  231. {
  232. iArg = (*pArgs)[i+1];
  233. char cZone[3];
  234. cZone[0] = iArg.c_str()[0];
  235. cZone[1] = iArg.c_str()[1];
  236. cZone[2] = 0;
  237. int zone = atoi(cZone);
  238. gr.m_proj = GEORef::UTM;
  239. gr.m_zone = zone;
  240. result = true;
  241. }
  242. if (StringUtil::StartsWith(iArg,"WGS84"))
  243. {
  244. //
  245. // USGS digital raster graphics say WGS84, but
  246. // they appear to actually be NAD27 using Clarke's
  247. // ellipsoid of 1866. Use GEORef::WGS84 if you 
  248. // are sure that your map is WGS84
  249. //
  250. gr.m_ellipse = GEORef::Clarke1866;//GEORef::WGS84;
  251. }
  252. if (StringUtil::StartsWith(iArg,"NAD27"))
  253. {
  254. gr.m_ellipse = GEORef::Clarke1866;
  255. }
  256. }
  257. }
  258. }
  259. if (TIFFGetField(tiff, GTIFF_TIEPOINTS, &d_list_count, &d_list))
  260. {
  261. gr.m_tieX = d_list[3];
  262. gr.m_tieY = d_list[4];
  263. }
  264. if (TIFFGetField(tiff, GTIFF_PIXELSCALE, &d_list_count, &d_list))
  265. {
  266. gr.m_resX = d_list[0];
  267. gr.m_resY = d_list[1];
  268. }
  269. XTIFFClose(tiff);
  270. GTIFFree(gtif);
  271. }
  272. }
  273. return result;
  274. }
  275. void GetTIFFProperties(const char * tiffName, UINT32 subImage,
  276.    ArrayContainer<std::string>& properties)
  277. {
  278. TIFF * tiff = TIFFOpen((char *)tiffName,"r");
  279. if (tiff)
  280. {
  281. int w=0, h=0, bps=0, packbits=0, photo=0, spp=0, rps=0;
  282. int orient=0;
  283. tdir_t d = (tdir_t)subImage;
  284. TIFFSetDirectory( tiff, d );
  285. TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH, &w);
  286. TIFFGetField(tiff,TIFFTAG_IMAGELENGTH, &h);
  287. TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bps);
  288. TIFFGetField(tiff, TIFFTAG_COMPRESSION, &packbits);
  289. TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photo);
  290. TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &spp);
  291. TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rps);
  292. TIFFGetField(tiff, TIFFTAG_ORIENTATION, &orient);
  293. string s;
  294. char txt[256];
  295. memset(txt, 0, (size_t)256);
  296. sprintf(txt,"TIFFTAG_IMAGEWIDTH = %d",w);
  297. s = txt;
  298. properties.AddElement(s);
  299. memset(txt, 0, (size_t)256);
  300. sprintf(txt,"TIFFTAG_IMAGELENGTH = %d",h);
  301. s = txt;
  302. properties.AddElement(s);
  303. memset(txt, 0, (size_t)256);
  304. sprintf(txt,"TIFFTAG_BITSPERSAMPLE = %d",bps);
  305. s = txt;
  306. properties.AddElement(s);
  307. memset(txt, 0, (size_t)256);
  308. sprintf(txt,"TIFFTAG_COMPRESSION = ");
  309. s = txt;
  310. switch (packbits){
  311. case COMPRESSION_NONE: s += "NONE"; break;
  312. case COMPRESSION_CCITTRLE: s += "CCITTRLE"; break;
  313. case COMPRESSION_CCITTFAX3: s += "CCITTFAX3 or CCITT_T4"; break;
  314. case COMPRESSION_CCITTFAX4: s += "CCITTFAX4 or CCITT_T6"; break;
  315. case COMPRESSION_LZW: s += "LZW"; break;
  316. case COMPRESSION_OJPEG: s += "OJPEG"; break;
  317. case COMPRESSION_JPEG: s += "JPEG"; break;
  318. case COMPRESSION_NEXT: s += "NEXT"; break;
  319. case COMPRESSION_CCITTRLEW: s += "CCITTRLEW"; break;
  320. case COMPRESSION_PACKBITS: s += "PACKBITS"; break;
  321. case COMPRESSION_THUNDERSCAN: s += "THUNDERSCAN"; break;
  322. /* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@apago.com) */
  323. case COMPRESSION_IT8CTPAD: s += "IT8CTPAD"; break;
  324. case COMPRESSION_IT8LW: s += "IT8LW"; break;
  325. case COMPRESSION_IT8MP: s += "IT8MP"; break;
  326. case COMPRESSION_IT8BL: s += "IT8BL"; break;
  327. /* compression codes 32908-32911 are reserved for Pixar */
  328. case COMPRESSION_PIXARFILM: s += "PIXARFILM"; break;
  329. case COMPRESSION_PIXARLOG: s += "PIXARLOG"; break;
  330. case COMPRESSION_DEFLATE: s += "DEFLATE"; break;
  331. case COMPRESSION_ADOBE_DEFLATE: s += "ADOBE_DEFLATE"; break;
  332. /* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
  333. case COMPRESSION_DCS: s += "DCS"; break;
  334. case COMPRESSION_JBIG: s += "JBIG"; break;
  335. case COMPRESSION_SGILOG: s += "SGILOG"; break;
  336. case COMPRESSION_SGILOG24: s += "SGILOG24"; break;
  337. //case COMPRESSION_JP2000: s += "JP2000"; break;
  338. }
  339. properties.AddElement(s);
  340. memset(txt, 0, (size_t)256);
  341. sprintf(txt,"TIFFTAG_PHOTOMETRIC = ");
  342. s = txt;
  343. switch (photo){
  344. case PHOTOMETRIC_MINISWHITE: s += "MINISWHITE"; break;
  345. case PHOTOMETRIC_MINISBLACK: s += "MINISBLACK"; break;
  346. case PHOTOMETRIC_RGB: s += "RGB"; break;
  347. case PHOTOMETRIC_PALETTE: s += "PALETTE"; break;
  348. case PHOTOMETRIC_MASK: s += "MASK"; break;
  349. case PHOTOMETRIC_SEPARATED: s += "SEPARATED"; break;
  350. case PHOTOMETRIC_YCBCR: s += "YCBCR"; break;
  351. case PHOTOMETRIC_CIELAB: s += "CIELAB"; break;
  352. //case PHOTOMETRIC_ICCLAB: s += "ICCLAB"; break;
  353. case PHOTOMETRIC_ITULAB: s += "ITULAB"; break;
  354. case PHOTOMETRIC_LOGL: s += "LOGL"; break;
  355. case PHOTOMETRIC_LOGLUV: s += "LOGLUV"; break;
  356. }
  357. properties.AddElement(s);
  358. memset(txt, 0, (size_t)256);
  359. sprintf(txt,"TIFFTAG_SAMPLESPERPIXEL = %d",spp);
  360. s = txt;
  361. properties.AddElement(s);
  362. TIFFClose(tiff);
  363. GEORef gr;
  364. if (ReadGeoInfo(tiffName,gr))
  365. {
  366. memset(txt, 0, (size_t)256);
  367. sprintf(txt,"GTIFF_TIEPOINTS = ( %.2f, %.2f )",gr.m_tieX,gr.m_tieY);
  368. s = txt;
  369. properties.AddElement(s);
  370. memset(txt, 0, (size_t)256);
  371. sprintf(txt,"GTIFF_PIXELSCALE = ( %.7f, %.7f )",gr.m_resX,gr.m_resY);
  372. s = txt;
  373. properties.AddElement(s);
  374. memset(txt, 0, (size_t)256);
  375. sprintf(txt,"UTM Zone = %d",gr.m_zone);
  376. s = txt;
  377. properties.AddElement(s);
  378. }
  379. }
  380. }
  381. int SaveDIB2TIFF(const char * output_file, DIBSection& dib)
  382. {
  383. int result = 0;
  384. UINT32 w = dib.Width();
  385. UINT32 h = dib.Height();
  386. UINT32 total_width = dib.GetTotalWidth();
  387. UINT32 bitcount = dib.GetBitCount();
  388. UINT32 bytecount = bitcount / 8;
  389. if (dib.IsCreated() && (w > 0) && (h > 0))
  390. {
  391. double image_gamma = TIFF_GAMMA;
  392. TIFF * tif;
  393. if ((tif = TIFFOpen(output_file, "w")) == NULL)
  394. {
  395. return result;
  396. }
  397.   // setup the image tags
  398. TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, w);
  399. TIFFSetField(tif, TIFFTAG_IMAGELENGTH, h);
  400. TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
  401. TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_PACKBITS);
  402. TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
  403. TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
  404. TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
  405. TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
  406. TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
  407. TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
  408. unsigned char * psrc = (unsigned char *)dib.GetBits();
  409. unsigned char * pdst = new unsigned char[(w * 3)];
  410. UINT32 src_index;
  411. UINT32 dst_index;
  412.   // now go line by line to write out the image data
  413. for (int row = 0; row < h; row++ ){
  414.   // initialize the scan line to zero
  415. memset(pdst,0,(size_t)(w * 3));
  416.   // moving the data from the dib to a row structure that can
  417.   // be used by the tiff library
  418. for (int col = 0; col < w; col++){
  419. src_index = (h - row - 1) * total_width * bytecount + col * bytecount;
  420. dst_index = col * 3;
  421. pdst[dst_index++] = psrc[src_index+2];
  422. pdst[dst_index++] = psrc[src_index+1];
  423. pdst[dst_index] = psrc[src_index];
  424. result++;
  425. }
  426.   // now actually write the row data
  427. TIFFWriteScanline(tif, pdst, row, 0);
  428. }
  429. TIFFClose(tif);
  430. }
  431. return result;
  432. }
  433. int OpenBigTIFF2DIB(const char * lpFileName, DIBSection& dib, int directory)    
  434. {
  435. int result = 0;
  436.     TIFF *tif;
  437.     unsigned long imageLength; 
  438.     unsigned long imageWidth; 
  439.     unsigned int BitsPerSample;
  440.     unsigned long LineSize;
  441.     unsigned int SamplePerPixel;
  442.     unsigned long RowsPerStrip;  
  443.     int PhotometricInterpretation;
  444.     long nrow;
  445. unsigned long row;
  446.     char *buf;          
  447.     char *lpBits;
  448.     HGLOBAL hStrip;
  449.     int i,l;
  450.     int Align; 
  451. bool bigTiff = false;
  452.     
  453.     tif = TIFFOpen(lpFileName, "r");
  454.     
  455.     if (!tif)
  456. {
  457.         return result;
  458. }
  459. tdir_t d = (tdir_t)directory;
  460. TIFFSetDirectory(tif,d);
  461.     
  462.     TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &imageWidth);
  463.     TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imageLength);  
  464.     TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &BitsPerSample);
  465.     TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &RowsPerStrip);  
  466.     TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &RowsPerStrip);   
  467.     TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &PhotometricInterpretation);
  468.            
  469.     LineSize = TIFFScanlineSize(tif); //Number of byte in ine line
  470.     SamplePerPixel = (int) (LineSize/imageWidth);
  471.     //Align = Number of byte to add at the end of each line of the DIB
  472.     Align = 4 - (LineSize % 4);
  473.     if (Align == 4) Align = 0;
  474.     
  475.     //Create a new DIB
  476. double dw = imageWidth;
  477. double dh = imageLength;
  478. double img_scale = 1.0;
  479. double hscale, vscale;
  480. const double MaxImageDimension = 4096;
  481. if ((imageWidth > MaxImageDimension) || (imageLength > MaxImageDimension))
  482. {
  483. bigTiff = true;
  484. if (dw > dh)
  485. {
  486. img_scale = (dw/MaxImageDimension);
  487. dh /= img_scale;
  488. dw = MaxImageDimension;
  489. hscale = (double)imageWidth/dw;
  490. vscale = (double)imageLength/dh;
  491. }
  492. else if (dw < dh)
  493. {
  494. img_scale = (dh/MaxImageDimension);
  495. dw /= img_scale;
  496. dh = MaxImageDimension;
  497. hscale = (double)imageWidth/dw;
  498. vscale = (double)imageLength/dh;
  499. }
  500. else
  501. {
  502. img_scale = (dh/MaxImageDimension);
  503. dw = MaxImageDimension;
  504. dh = MaxImageDimension;
  505. hscale = (double)imageWidth/dw;
  506. vscale = (double)imageLength/dh;
  507. }
  508. INT32 w = (INT32)(dw + 0.50);
  509. INT32 h = (INT32)(dh + 0.50);
  510. dib.Create(w,h,24);
  511.           
  512. lpBits = (char *)dib.GetBits();
  513. //In the tiff file the lines are save from up to down 
  514. //In a DIB the lines must be save from down to up
  515. if (lpBits)
  516. {
  517. hStrip = GlobalAlloc(GHND,TIFFStripSize(tif));
  518. buf = (char *)GlobalLock(hStrip);           
  519. if (!buf)
  520. goto OutOfBufMemory;
  521. //read the tiff lines and save them in the DIB
  522. //with RGB mode, we have to change the order of the 3 samples RGB
  523. // <=> BGR
  524. UINT32 next_row = 0;
  525. UINT32 current_row = 0;
  526. UINT32 img_row = 0;
  527. UINT32 src_col, src_row, dst_ndx, total_width;
  528. UINT32 row_incr = (UINT32)(vscale + 0.50);
  529. total_width = dib.GetTotalWidth();
  530. for (row = 0; row < imageLength; row += row_incr){
  531. nrow = (row + RowsPerStrip > imageLength ? imageLength - row :
  532. RowsPerStrip);
  533. if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0),
  534. buf, nrow*LineSize)==-1)
  535. {
  536. goto TiffReadError;
  537. else
  538. {  
  539. for (l = 0; l < nrow; l++){
  540. if (SamplePerPixel  == 3)
  541. {
  542. for (i=0;i<w;i++){
  543. src_col = (UINT32)(hscale * i + 0.50);
  544. if (src_col > imageWidth) src_col = imageWidth;
  545. src_row = l*LineSize;
  546. dst_ndx = 3 * (i + (h - img_row - 1) * total_width);
  547. lpBits[dst_ndx] = buf[src_row+src_col*SamplePerPixel+2];
  548. lpBits[++dst_ndx] = buf[src_row+src_col*SamplePerPixel+1];
  549. lpBits[++dst_ndx] = buf[src_row+src_col*SamplePerPixel+0];
  550. }
  551. img_row++;
  552. if (img_row == h) break;
  553. }
  554. }
  555. if (img_row == h) break;
  556. }
  557. }
  558. result++;
  559. GlobalUnlock(hStrip);
  560. GlobalFree(hStrip);
  561. }
  562. TIFFClose(tif);
  563. }
  564. else
  565. {
  566. /*
  567. INT32 w = imageWidth;
  568. INT32 h = imageLength;
  569. dib.Create(w,h,24);
  570.           
  571. lpBits = (char *)dib.GetBits();
  572. if (lpBits)
  573. {
  574. hStrip = GlobalAlloc(GHND,TIFFStripSize(tif));
  575. buf = (char *)GlobalLock(hStrip);           
  576. if (!buf)
  577. goto OutOfBufMemory;
  578. //read the tiff lines and save them in the DIB
  579. //with RGB mode, we have to change the order of the 3 samples RGB
  580. // <=> BGR
  581. UINT32 next_row = 0;
  582. UINT32 current_row = 0;
  583. UINT32 img_row = 0;
  584. UINT32 src_col, src_row, dst_ndx, total_width;
  585. UINT32 row_incr = 1;
  586. total_width = dib.GetTotalWidth();
  587. for (row = 0; row < imageLength; row++){
  588. nrow = ((row + RowsPerStrip) > imageLength) ? (imageLength - row) :
  589. (RowsPerStrip);
  590. if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0),
  591. buf, nrow*LineSize) == -1)
  592. {
  593. goto TiffReadError;
  594. else
  595. {
  596. if (SamplePerPixel  == 3)
  597. {
  598. for (l = 0; l < nrow; l++){
  599. for (i=0;i<w;i++){
  600. src_col = i;
  601. if (src_col > imageWidth) src_col = imageWidth;
  602. src_row = l*LineSize;
  603. dst_ndx = 3 * (i + (h - img_row - 1) * total_width);
  604. lpBits[dst_ndx] = buf[src_row+src_col*SamplePerPixel+2];
  605. lpBits[++dst_ndx] = buf[src_row+src_col*SamplePerPixel+1];
  606. lpBits[++dst_ndx] = buf[src_row+src_col*SamplePerPixel+0];
  607. }
  608. img_row++;
  609. if (img_row == h) break;
  610. }
  611. }
  612. if (img_row == h) break;
  613. }
  614. }
  615. }
  616. result++;
  617. GlobalUnlock(hStrip);
  618. GlobalFree(hStrip);
  619. */
  620. TIFFClose(tif);
  621. return OpenTIFF2DIB(lpFileName,dib,directory);
  622. }
  623. return result;
  624. OutOfBufMemory:
  625. TiffReadError:
  626. GlobalFree(hStrip); 
  627. }