Bash parameter expansion supports several modifications it can do to the value while expanding a variable. One of them is ##, which removes the longest prefix of the value matching a pattern (patterns are not regular expressions here).
In this case the pattern is *.. That matches any zero or more characters followed by a .. ${x##*.} means to remove all of the string up to the last . character, and leave everything after that dot.
${1##*.} means to do that expansion using the value of the first positional parameter, the one you'd usually access with $1. The final result of
echo "${1##*.}"
is then to print out the part of the first argument of the script that comes after the last ., which is the filename extension.
If the pattern doesn't match at all, the full value of the variable is expanded, just as if you hadn't used the ##. In this case, if the argument you gave didn't have a . in it at all then you'd just get it back out again.
Bash also supports a single # to take the shortest matching prefix off, and the same thing with % to match the end of the string instead.