I was able to get it running much better by only copying the part of the source image I need, then scaling that to fit the destination, instead of scaling it first and then cropping.
each y in range imgy slicex:imgx/(((y/imgy)*(hs-1))+1) temp:img.copy[(0,y) (imgx,1)] img.paste[temp.copy[((imgx-slicex)/2,0) (slicex,1)] (0,y,imgx,1) 1] end

The moral of the story is: don't render 600,000 extra pixels for no reason and then throw them in the trash.