GeoTiff to 16 bit tiff, png or bmp image for heightmap

I think the problem could be with the range of values in your original image. You can use the -scale parameter in gdal_translate to get images within the range of an 8 bit image.

For example

gdal_translate -of PNG -ot Byte -scale in_tiff.tif out_png_scaled.png

This will automatically set the input minimum and maximum values used to scale, if these don't work you can specify a minimum and maximum value after -scale.

If you need to make the image smaller you can also resize with gdal_translate using -outsize. For example, -outsize 50% 50% will resize to 50 % of the original.