@@ -292,7 +292,11 @@ bool TiffDecoder::readData( Mat& img )
292
292
{
293
293
if (m_hdr && img.type () == CV_32FC3)
294
294
{
295
- return readHdrData (img);
295
+ return readData_32FC3 (img);
296
+ }
297
+ if (img.type () == CV_32FC1)
298
+ {
299
+ return readData_32FC1 (img);
296
300
}
297
301
bool result = false ;
298
302
bool color = img.channels () > 1 ;
@@ -528,8 +532,9 @@ bool TiffDecoder::readData( Mat& img )
528
532
return result;
529
533
}
530
534
531
- bool TiffDecoder::readHdrData (Mat& img)
535
+ bool TiffDecoder::readData_32FC3 (Mat& img)
532
536
{
537
+
533
538
int rows_per_strip = 0 , photometric = 0 ;
534
539
if (!m_tif)
535
540
{
@@ -559,6 +564,44 @@ bool TiffDecoder::readHdrData(Mat& img)
559
564
return true ;
560
565
}
561
566
567
+ bool TiffDecoder::readData_32FC1 (Mat& img)
568
+ {
569
+ if (!m_tif)
570
+ {
571
+ return false ;
572
+ }
573
+ TIFF *tif = static_cast <TIFF*>(m_tif);
574
+
575
+ uint32 img_width, img_height;
576
+ TIFFGetField (tif,TIFFTAG_IMAGEWIDTH, &img_width);
577
+ TIFFGetField (tif,TIFFTAG_IMAGELENGTH, &img_height);
578
+ if (img.size () != Size (img_width,img_height))
579
+ {
580
+ close ();
581
+ return false ;
582
+ }
583
+ tsize_t scanlength = TIFFScanlineSize (tif);
584
+ tdata_t buf = _TIFFmalloc (scanlength);
585
+ float * data;
586
+ for (uint32 row = 0 ; row < img_height; row++)
587
+ {
588
+ if (TIFFReadScanline (tif, buf, row) != 1 )
589
+ {
590
+ close ();
591
+ return false ;
592
+ }
593
+ data=(float *)buf;
594
+ for (uint32 i=0 ; i<img_width; i++)
595
+ {
596
+ img.at <float >(row,i) = data[i];
597
+ }
598
+ }
599
+ _TIFFfree (buf);
600
+ close ();
601
+
602
+ return true ;
603
+ }
604
+
562
605
// ////////////////////////////////////////////////////////////////////////////////////////
563
606
564
607
TiffEncoder::TiffEncoder ()
@@ -818,7 +861,7 @@ bool TiffEncoder::writeLibTiff( const Mat& img, const std::vector<int>& params)
818
861
return true ;
819
862
}
820
863
821
- bool TiffEncoder::writeHdr (const Mat& _img)
864
+ bool TiffEncoder::write_32FC3 (const Mat& _img)
822
865
{
823
866
Mat img;
824
867
cvtColor (_img, img, COLOR_BGR2XYZ);
@@ -857,13 +900,58 @@ bool TiffEncoder::writeHdr(const Mat& _img)
857
900
return true ;
858
901
}
859
902
903
+ bool TiffEncoder::write_32FC1 (const Mat& _img)
904
+ {
905
+
906
+ TIFF* tif;
907
+
908
+ TiffEncoderBufHelper buf_helper (m_buf);
909
+ if ( m_buf )
910
+ {
911
+ tif = buf_helper.open ();
912
+ }
913
+ else
914
+ {
915
+ tif = TIFFOpen (m_filename.c_str (), " w" );
916
+ }
917
+
918
+ if (!tif)
919
+ {
920
+ return false ;
921
+ }
922
+
923
+ TIFFSetField (tif, TIFFTAG_IMAGEWIDTH, _img.cols );
924
+ TIFFSetField (tif, TIFFTAG_IMAGELENGTH, _img.rows );
925
+ TIFFSetField (tif, TIFFTAG_SAMPLESPERPIXEL, 1 );
926
+ TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 32 );
927
+ TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
928
+ TIFFSetField (tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
929
+ TIFFSetField (tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
930
+ for (uint32 row = 0 ; row < (uint32)_img.rows ; row++)
931
+ {
932
+ if (TIFFWriteScanline (tif, (tdata_t )_img.ptr <float >(row), row, 1 ) != 1 )
933
+ {
934
+ TIFFClose (tif);
935
+ return false ;
936
+ }
937
+ }
938
+ TIFFWriteDirectory (tif);
939
+ TIFFClose (tif);
940
+
941
+ return true ;
942
+ }
943
+
860
944
bool TiffEncoder::write ( const Mat& img, const std::vector<int >& params)
861
945
{
862
946
int depth = img.depth ();
863
947
864
948
if (img.type () == CV_32FC3)
865
949
{
866
- return writeHdr (img); // TODO Rename
950
+ return write_32FC3 (img);
951
+ }
952
+ if (img.type () == CV_32FC1)
953
+ {
954
+ return write_32FC1 (img);
867
955
}
868
956
869
957
CV_Assert (depth == CV_8U || depth == CV_16U);
0 commit comments