Sounds like you want to create a new struct that represents a 3 byte unsigned integer (based solely on the max value quoted).
Using your original method is very prone to failure, firstly, Take(3) is dependent on whether the system you're running on is big-endian or little-endian, secondly, it doesn't take into account what happens when you get passed a negative int which your new struct can't handle.
You will need to write the conversions yourself, I would take in the int as given, check if it's negative, check if it's bigger than 16777215, if it passes those checks then it's between 0 and 16777215 and you can store it in your new struct, simply execute a Where(b => b != 0) instead of Take(3) to get around the endian-ness problem. Obviously take into account the 0 case where all bytes = 0.
intin C# into just 3 bytes, so you're going to have to lose 8 bits either way, dropping "the last byte" seems every bit as good as an alternative, or did your question for a "better way" ask if there's a way to avoid dropping bits at all? Please clarify how you would judge if an alternate solution is better or worse than just "dropping the last byte".