Will this converstion to/from fixed point cause me to lose precision?
If the SANE_Fixed type has a constantly fixed precision of 1/65536, that means it always stores the fractional part of the number as a 16 bit (two-byte) unsigned integer (hence the SANE_FIXED_SCALE_SHIFT of 16 bits).  Since the whole number portion of the value can range from -32768 to 32767, that means that the whole part of the number is represented with a 16 bit signed integer (making the type use a total of 4 bytes).

The decimal type in .NET, while it is a floating point type, it is far more precise that the traditional float type.  It stores a 96 bit integer (plus an additional bit for the sign).  It then stores the position of the decimal point as a 5-bit integer, which allows the decimal point to be located after any digit in the 96-bit integer value.  As such, the larger the value gets, the lower the fractional precision becomes.  

In other words, the decimal type can store a value up to 79,228,162,514,264,337,593,543,950,335 (29 digits).  If it does store a 29 digit number, however, it will be unable to store any fractional value with that.  It will only store the whole part of the number.  If, however, it is only storing a single digit value, the fractional part can be up to 28 digits long (e.g. 0.0000000000000000000000000001).

Bearing all of that in mind, if the maximum whole number that the SANE_Fixed type can store is 32767 (a five digit number), when cast to a decimal type, that leaves 24 digits of precision (e.g. 1/10^24) in the fractional part of the number.  That is still far more precise than the 1/65536 precision provided by the SANE_Fixed type.  

Therefore, you can be confident that the decimal type will accurately retain the precise value.  Obviously, when casting from a decimal back into a SANE_Fixed type, you will lose precision, but since the value came from that type in the first place, your values are safe.