return (Image)(new Bitmap(i, newSize));
You are letting the Bitmap constructor resize the image. It will pick a "good" interpolation mode that attempts to avoid the blocky appearance you get from making pixels four times as big. You however prefer the blocky look, that means you'll have to take control of the Interpolation mode yourself. Like this:
public static Image ResizeImage(Image img, Size size) {
var bmp = new Bitmap(size.Width, size.Height);
using (var gr = Graphics.FromImage(bmp)) {
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
gr.DrawImage(img, new Rectangle(Point.Empty, size));
}
return bmp;
}
Also note that you may prefer the look you'll get when you insert gr.Clear(Color.White); inside that code and not change the InterpolationMode. That avoids a problem with the transparent pixels in the original image having an awkward RGB value.