@chris: this isn’t the lightest operation, but it gets the job done and as long as you’re not constantly loading new images in a tight loop during critical gameplay moments, it should appear seamless. You can just create your own image loading function and use that in lieu of the usual display.newImage and/or display.newImageRect calls.
I’m typing this code up on the fly, so it hasn’t been tested, but it should work. It follows the syntax for display.newImageRect, so you can optionally pass in a parent display group and custom width/height values to override the @1x values if you wish. It adds a new function to the display library that I’m calling ‘display.myNewImage’, but you could obviously call it whatever you want.
function display.myNewImage(...) local parent = display.currentStage local filename = '' local baseDir = system.ResourceDirectory local w, h = nil, nil for i = 1, #arg do local a = arg[i] if type(a) == 'string' then filename = a elseif type(a) == 'table' then parent = a elseif type(a) == 'userdata' then baseDir = a elseif type(a) == 'number' then if w == nil then w = a else h = a end end end if (w == nil and h == nil) then local sizer = display.newImage(filename, baseDir) w, h = sizer.width, sizer.height display.remove(sizer) sizer = nil end img = display.newImageRect(parent, filename, baseDir, w, h) return img end