I found the source of the problem with this.
In VectorRenderer DrawPoint(Graphics g, IPoint point, Image symbol, flat symbolscale, PointF offset, float rotation, Map map)
The call to DrawImageUnscaled uses an int for the x and y position of the image. This introduces an error because the image position is being moved by half the width and height of the image so that it is centered on the point.
Also, if a symbol scale is used then the DrawImage method is being called instead of DrawImageUnscaled, which uses float values instead. However, the x and y position is being cast to an int so the same problem occurs.
Is there really a need to check if the symbolscale is 1f and call DrawSymbolUnscaled? If the symbolscale is 1f then the code in the else statement wont change the scale. So simply removing the calls to DrawImageUnscaled and the surrounding if/else and calling
DrawImage would suffice.
Remove the cast to int on the x and y positions in calls to DrawImage.
That fixes the problem for me. Are there any issues with getting this change added into SharpMap?