Thank you, Silvia!
There is another recent MMa.SE thread with important observations:
Please note the second bullet point in the "TL;DR" section of my answer there: it stresses an undesirable side effect of the current (version 13.0.0) mechanism of handling of ImageResolution by the system.
The problem is that on the Image rendering ("typesetting") stage the Image option value (for example) ImageResolution -> 96 is first translated into the value of ImageSizeRaw option of GraphicsBox through multiplying ImageDimensions by the coefficient (72/96), and then ImageSizeRaw seemingly is rounded down by the FrontEnd before applying the hidden scale 96/72 on Windows. As the result, we don't get the pixel-perfect rendering even for images with ImageResolution -> 96 (i.e. with resolution equal to the most common screen resolution on Windows systems 96 DPI), for which we should have pixel-perfect rendering naturally.
You can see how the translation happens by applying ToBoxes:
img = RandomImage[1, {110, 113}, ImageResolution -> 96]
Options[ToBoxes[img], ImageSizeRaw]
