TIFF import pixel rounding
Summary
y pixels can be off by one in TIFF import
What is the current bug behaviour?
When importing a TIFF, the y pixel is determined by calculating the double value given by _row_size - _y_res * (_y_off + y) - 1, and then implicitly casting it to an unsigned integer:
Here
-
y_dbl = y_res * (_y_off + y)is the desired location in the image with (0,0) in the bottom left of the image -
_row_size - 1 - y_dblflips the y axis such that (0,0) is in the top left to match the TIFF
However, if for example y_dbl = _row_size - 1.2, then _row_size - 1 - y_dbl = 0.2 -> implicitly cast to 0
What is the expected correct behaviour?
The desired value for this example is 1, since the point lies in the second row from the top of the image.
Ideas how to fix this?
This is caused by doing the subtraction to flip the y axis before casting to truncate the double.
If y_dbl is first explicitly cast to an unsigned int before subtraction, then we get the desired behaviour for the example case:
y_int = static_cast<T>(_row_size - 1.2) = _row_size - 2, and then _row_size - 1 - (_row_size - 2) = 1
Suggested change:
const T j = _row_size - static_cast<T>(_y_res * (_y_off + y)) - 1;