It’s down to the interpolation. The badly scaled image looks like nearest neighbour to me. If you’re using the default shaders, then you’ve got the choice of nearest neighbour and linear interpolation. You can set the interpolation for a texture with something like:
auto sprite = Sprite::create(...);
auto tex = sprite->getTexture();
tex->setAntiAliasTexParameters(); // Anti-alias -- linear filter
// tex->setAliasTexParameters(); // Alias -- nearest neighbour filter
If you want something else, like bi-cubic, you’d have to write a custom shader. I had a play around, and didn’t find bi-cubic to look any better than linear. In this example, the upper row is scaled down, and the lower row is scaled up.