Commit fc8f0e34 authored by Kobi Gurkan's avatar Kobi Gurkan

adding support for 16-bit 4 channel tiffs

- when IMREAD_UNCHANGED is set in flags, the tiff is read with 4 channels
- adding test for read/write
parent 7da0e37b
...@@ -158,7 +158,7 @@ bool TiffDecoder::readHeader() ...@@ -158,7 +158,7 @@ bool TiffDecoder::readHeader()
m_type = CV_MAKETYPE(CV_8U, photometric > 1 ? wanted_channels : 1); m_type = CV_MAKETYPE(CV_8U, photometric > 1 ? wanted_channels : 1);
break; break;
case 16: case 16:
m_type = CV_MAKETYPE(CV_16U, photometric > 1 ? 3 : 1); m_type = CV_MAKETYPE(CV_16U, photometric > 1 ? wanted_channels : 1);
break; break;
case 32: case 32:
...@@ -326,6 +326,21 @@ bool TiffDecoder::readData( Mat& img ) ...@@ -326,6 +326,21 @@ bool TiffDecoder::readData( Mat& img )
(ushort*)(data + img.step*i) + x*3, 0, (ushort*)(data + img.step*i) + x*3, 0,
cvSize(tile_width,1) ); cvSize(tile_width,1) );
} }
else if (ncn == 4)
{
if (wanted_channels == 4)
{
icvCvt_BGRA2RGBA_16u_C4R(buffer16 + i*tile_width0*ncn, 0,
(ushort*)(data + img.step*i) + x * 4, 0,
cvSize(tile_width, 1));
}
else
{
icvCvt_BGRA2BGR_16u_C4C3R(buffer16 + i*tile_width0*ncn, 0,
(ushort*)(data + img.step*i) + x * 3, 0,
cvSize(tile_width, 1), 2);
}
}
else else
{ {
icvCvt_BGRA2BGR_16u_C4C3R(buffer16 + i*tile_width0*ncn, 0, icvCvt_BGRA2BGR_16u_C4C3R(buffer16 + i*tile_width0*ncn, 0,
......
...@@ -139,9 +139,6 @@ public: ...@@ -139,9 +139,6 @@ public:
string filename = cv::tempfile(".jpg"); string filename = cv::tempfile(".jpg");
imwrite(filename, img); imwrite(filename, img);
img = imread(filename, IMREAD_UNCHANGED);
filename = string(ts->get_data_path() + "readwrite/test_" + char(k + 48) + "_c" + char(num_channels + 48) + ".jpg");
ts->printf(ts->LOG, "reading test image : %s\n", filename.c_str()); ts->printf(ts->LOG, "reading test image : %s\n", filename.c_str());
Mat img_test = imread(filename, IMREAD_UNCHANGED); Mat img_test = imread(filename, IMREAD_UNCHANGED);
...@@ -160,8 +157,9 @@ public: ...@@ -160,8 +157,9 @@ public:
#endif #endif
#ifdef HAVE_TIFF #ifdef HAVE_TIFF
for (int num_channels = 1; num_channels <= 3; num_channels+=2) for (int num_channels = 1; num_channels <= 4; num_channels++)
{ {
if (num_channels == 2) continue;
// tiff // tiff
ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_16U, num_channels, ".tiff"); ts->printf(ts->LOG, "image type depth:%d channels:%d ext: %s\n", CV_16U, num_channels, ".tiff");
Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_16U, num_channels), Scalar::all(0)); Mat img(img_r * k, img_c * k, CV_MAKETYPE(CV_16U, num_channels), Scalar::all(0));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment