Right. That there is the problem. Corona’s “Dynamic Image Resolution” feature expects you to set th @2x and @4x suffixes to 2.0 and 4.0 respectively. It was never really designed for you to set them to higher or lower values, even though it will blindly accept them anyways (our renderer has no choice but to assume you’ve configured it correctly). And the biggest issue with setting the scale to a lower value is that in the worst case scenario, your images will be scaled down. And if scaled down far enough, you’ll lose pixels in your image. This can be an issue on any platform and I don’t recommend it. In the case of Android, the solution is to add more image assets of different resolutions.
So, first, I recommend that you change you image suffix scales to this…
imageSuffix = { ["@2X"] = 2.0, ["@4X"] = 4.0, }
But your config also has another problem where you are dynamically setting the content width and height. This can cause scaled/blurry images as well. Think about it. Your base images that do not have an image suffix scale are designed to be display for a particular pixel resolution, such as 320x480. In order for them to be displayed pixel perfect, you would need to set your content width and height to that base pixel resolution of 320x480 as well. If you didn’t, and say set the content width and height to 400x600, then your images designed for a lower 320x480 pixel resolution will end up being scaled up and appear blurry. Makes sense, right? This is effectively what’s happening in your app. Setting your content width and height dynamically goes against the design of our Dynamic Image Resolution feature because it selects image files (ie: 2x, 4x, etc.) based on the currently configured content width and height, when really you want this feature to choose an image file that is exactly 2x or 4x pixel resolution bigger than the base image files. And the only way to do this is to hard code the content width and height.
(Based on your code, you happen to only change the content width and height based on aspect ratio. So, the above is likely only an issue on Android and if you configured your desktop app to be resizable or support fullscreen mode.)