I’ll just throw out that the operations you are doing, like min, max, and round, are also methods on Double and Float (Int and Long have min and max). So you could consider writing your method in the following way.
0L max 255L min lower + ((upper - lower) * scale).round
Note that I had to make the bounds be Longs because min and max require the same types.
As for getting out an Int, it has already been asked how you want to handle overflow because Double can hold larger whole numbers than Int can. The simplest approach is the toInt method, which just ignores overflows, and the value wraps around. However, if you call toInt after your min and max have occurred, you know that the value is between 0 and 255, so there is no possibility that part of the expression can overflow and toInt is safe.
(0L max 255L min lower + ((upper - lower) * scale).round).toInt
Granted, the round can still have problems if the Double expression is larger than Long.MaxValue. The round method simply truncates, so 1e100.round is Long.MaxValue.