I think this is correct, that it really just depends the way you are used to working with images. For the sites I build, if I ask for an image of a specific size, it's because that's the size I need. I don't care what it has to do to get there, because the needs of my layout are more important than the image itself. An image of any size other than what I asked for would be inconsistent at best or a layout breaker at worst. I'm usually dealing with lots of images that I depend on being consistent with each other in size. I hate upscaling, but I hate inconsistency even more. If something has to be upscaled then I'm going to notice that and try to find a better image, but at least the damage is limited to the image rather than the layout or consistency.
Here's another way to accomplish it. Put this somewhere in one of your first template includes:
function sizeDown(HookEvent $event) {
$width = (int) $event->arguments[0];
$height = (int) $event->arguments[1];
$image = $event->object;
if($image->width < $width) $width = $image->width;
if($image->height < $height) $height = $image->height;
$event->return = $image->size($width, $height);
}
$wire->addHook('Pageimage::sizeDown', null, 'sizeDown');
Now you can substitute any $image->size() call with $image->sizeDown():
$image = $page->image->sizeDown(300, 200);