position: new Vector2(50, 50),
origin: new Vector2(rectangleFromImage.Width / 2, 0),
So your scale is 0.01f
That means the original resolution divided by 100. Therefore it should be 1.5f x 6 pixels (or 2x6 pixels). That corresponds to the output image.
So the question really is - why do you need a 600x150 pixel image to make a 6x2 pixel one?
EDIT Nevermind. I understand now
The issue lays in the way the texture is read - for each pixel in the final output we check the corresponding pixel at that position in the original image. So we do not “downscale” the image but instead we only check 6x2 = 12 pixels in the original super large file.
To give an example - if your final image is 10 pixels and the original is 1000 pixels wide then we read the 50th, the 150th, the 250th etc. pixel in the original bitmap for our final output.
You chose “SamplerState.LinearWrap” which makes this a bit better in that we also check the neighbouring pixels and interpolate between them, but these are most likely also black.
Downscaling something to 1% of the orginal size doesn’t work very well with the normal graphics pipeline.
You cannot fix this in the code. The only way to fix that is downsample the image in paint.net to a value close to the final output resolution you want.
new Vector2(rectangleFromImage.Width / 2, 0),
this line should be
new Vector2(rectangleFromImage.Width / 2f, 0),
You divide an int (width) by an int (2), so the output must be an int again. Therefore your origin is sometimes a bit off, if the original image resolution is not an even number. For example 3 / 2 would be 1.
If you add the f to the 2 -> 2f it will be treated as a float and we get 3 / 2 = 1.5f