Howdy! I'm the sheriff of code golf!
JavaScript (ES6), 171 bytes

Takes input in currying syntax (width)(height). Returns an array of strings.

w=&gt;h=&gt;[...Array((h&gt;0?h:-h)*16||1)].map((_,y)=&gt;'012345678'.replace(/./g,x=&gt;' #'[((c=+'3733317900134444'[(h&lt;0?16-~y/h:y/h)|0]||17)&gt;&gt;4-x|c&gt;&gt;x-4)&amp;1|!h].repeat(w&gt;0?w:-w))||'#')


Try it online!

How?

Only the left half of the sheriff is encoded as binary bitmasks, including the middle column:

    ##.         00011     3
   ###..        00111     7
    ##.         00011     3
    ##.         00011     3
    ##.         00011     3
     #          00001     1
   ###..        00111     7
  #  #  .       01001     9
 #   #   .  --&gt; 10001 --&gt; 17
 #   #   .      10001     17
     #          00001     1
    ##.         00011     3
   #   .        00100     4
   #   .        00100     4
   #   .        00100     4
   #   .        00100     4


Because there are only two values greater than \$9\$ and they're both equal to \$17\$, we can replace them with \$0\$ in order to have one character per row and still have a rather straightforward decoding process. Hence the packed string:

'3733317900134444'


For \$0 \le x \le 8\$ and \$0 \le y \le 15\$, the 'pixel' at \$(x,y)\$ is given by:

' #'[                                  // character lookup:
  (                                    //   0 = space
    (                                  //   1 = '#'
      c = +'3733317900134444'[y] || 17 // extract the bitmask for this row; 0 -&gt; 17
    )   &gt;&gt; 4 - x                       // test the left part, middle column included
    | c &gt;&gt; x - 4                       // test the right part, middle column also included
  ) &amp; 1                                // isolate the least significant bit
]                                      // end of character lookup