@ -408,8 +408,8 @@ TEST(Highgui_Tiff, decode_tile16384x16384)
try
{
cv : : imread ( file3 ) ;
EXPECT_NO_THROW ( cv : : imread ( file4 ) ) ;
cv : : imread ( file3 , CV_LOAD_IMAGE_UNCHANGED ) ;
EXPECT_NO_THROW ( cv : : imread ( file4 , CV_LOAD_IMAGE_UNCHANGED ) ) ;
}
catch ( const std : : bad_alloc & )
{
@ -419,4 +419,52 @@ TEST(Highgui_Tiff, decode_tile16384x16384)
remove ( file3 . c_str ( ) ) ;
remove ( file4 . c_str ( ) ) ;
}
TEST ( Highgui_Tiff , write_read_16bit_big_little_endian )
{
// see issue #2601 "16-bit Grayscale TIFF Load Failures Due to Buffer Underflow and Endianness"
// Setup data for two minimal 16-bit grayscale TIFF files in both endian formats
uchar tiff_sample_data [ 2 ] [ 86 ] = { {
// Little endian
0x49 , 0x49 , 0x2a , 0x00 , 0x0c , 0x00 , 0x00 , 0x00 , 0xad , 0xde , 0xef , 0xbe , 0x06 , 0x00 , 0x00 , 0x01 ,
0x03 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x02 , 0x00 , 0x00 , 0x00 , 0x01 , 0x01 , 0x03 , 0x00 , 0x01 , 0x00 ,
0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x02 , 0x01 , 0x03 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x10 , 0x00 ,
0x00 , 0x00 , 0x06 , 0x01 , 0x03 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x11 , 0x01 ,
0x04 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x08 , 0x00 , 0x00 , 0x00 , 0x17 , 0x01 , 0x04 , 0x00 , 0x01 , 0x00 ,
0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 } , {
// Big endian
0x4d , 0x4d , 0x00 , 0x2a , 0x00 , 0x00 , 0x00 , 0x0c , 0xde , 0xad , 0xbe , 0xef , 0x00 , 0x06 , 0x01 , 0x00 ,
0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x02 , 0x00 , 0x00 , 0x01 , 0x01 , 0x00 , 0x03 , 0x00 , 0x00 ,
0x00 , 0x01 , 0x00 , 0x01 , 0x00 , 0x00 , 0x01 , 0x02 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x10 ,
0x00 , 0x00 , 0x01 , 0x06 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x01 , 0x00 , 0x00 , 0x01 , 0x11 ,
0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x08 , 0x01 , 0x17 , 0x00 , 0x04 , 0x00 , 0x00 ,
0x00 , 0x01 , 0x00 , 0x00 , 0x00 , 0x04 }
} ;
// Test imread() for both a little endian TIFF and big endian TIFF
for ( int i = 0 ; i < 2 ; i + + )
{
string filename = cv : : tempfile ( " .tiff " ) ;
// Write sample TIFF file
FILE * fp = fopen ( filename . c_str ( ) , " wb " ) ;
ASSERT_TRUE ( fp ! = NULL ) ;
ASSERT_EQ ( ( size_t ) 1 , fwrite ( tiff_sample_data , 86 , 1 , fp ) ) ;
fclose ( fp ) ;
Mat img = imread ( filename , CV_LOAD_IMAGE_UNCHANGED ) ;
EXPECT_EQ ( 1 , img . rows ) ;
EXPECT_EQ ( 2 , img . cols ) ;
EXPECT_EQ ( CV_16U , img . type ( ) ) ;
EXPECT_EQ ( sizeof ( ushort ) , img . elemSize ( ) ) ;
EXPECT_EQ ( 1 , img . channels ( ) ) ;
EXPECT_EQ ( 0xDEAD , img . at < ushort > ( 0 , 0 ) ) ;
EXPECT_EQ ( 0xBEEF , img . at < ushort > ( 0 , 1 ) ) ;
remove ( filename . c_str ( ) ) ;
}
}
# endif