I have fixed this issue in my project and it be nice to share:

Just replace it at Nop.Common/Media/PictureManager.cs

notice the second switch (lastPart) to determine the file extension which will then determine the FileFormat used by the Bitmap.Save function call.

It was always using FileFormat.Jpeg before.

Also, the following added lines will enforce better quality when resizing the images.


g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;



        public static string GetPictureUrl(Picture picture, int TargetSize, bool showDefaultPicture)
        {
            string url = string.Empty;
            if (picture == null)
            {
                if (showDefaultPicture)
                    url = GetDefaultPictureUrl(TargetSize);
                return url;
            }

            string[] parts = picture.Extension.Split('/');
            string lastPart = parts[parts.Length - 1];
            switch (lastPart)
            {
                case "pjpeg":
                    lastPart = "jpg";
                    break;
                case "x-png":
                    lastPart = "png";
                    break;
                case "x-icon":
                    lastPart = "ico";
                    break;
            }

      ImageFormat imageFormat;

      switch (lastPart)
      {
        case "jpg":
          imageFormat = ImageFormat.Jpeg;
          break;
        case "gif":
          imageFormat = ImageFormat.Gif;
          break;
        case "png":
          imageFormat = ImageFormat.Png;
          break;
        case "ico":
          imageFormat = ImageFormat.Icon;
          break;
        default:
          imageFormat = ImageFormat.Jpeg;
          break;
      }

            string localFilename = string.Empty;
            if (picture.IsNew)
            {
                string filter = string.Format("{0}*.*", picture.PictureID.ToString("0000000"));
                string[] currentFiles = System.IO.Directory.GetFiles(PictureManager.LocalThumbImagePath, filter);
                foreach (string currentFileName in currentFiles)
                    File.Delete(Path.Combine(PictureManager.LocalThumbImagePath, currentFileName));

                picture = PictureManager.UpdatePicture(picture.PictureID, picture.PictureBinary, picture.Extension, false);
            }
            lock (s_lock)
            {
                if (TargetSize == 0)
                {
                    localFilename = string.Format("{0}.{1}", picture.PictureID.ToString("0000000"), lastPart);
                    if (!File.Exists(Path.Combine(PictureManager.LocalThumbImagePath, localFilename)))
                    {
                        if (!System.IO.Directory.Exists(PictureManager.LocalThumbImagePath))
                        {
                            System.IO.Directory.CreateDirectory(PictureManager.LocalThumbImagePath);
                        }
                        File.WriteAllBytes(Path.Combine(PictureManager.LocalThumbImagePath, localFilename), picture.PictureBinary);
                    }
                }
                else
                {
                    localFilename = string.Format("{0}_{1}.{2}", picture.PictureID.ToString("0000000"), TargetSize, lastPart);
                    if (!File.Exists(Path.Combine(PictureManager.LocalThumbImagePath, localFilename)))
                    {
                        if (!System.IO.Directory.Exists(PictureManager.LocalThumbImagePath))
                        {
                            System.IO.Directory.CreateDirectory(PictureManager.LocalThumbImagePath);
                        }
                        using (MemoryStream stream = new MemoryStream(picture.PictureBinary))
                        {
                            Bitmap b = new Bitmap(stream);

                            Size newSize = CalculateDimensions(b.Size, TargetSize);

                            if (newSize.Width < 1)
                                newSize.Width = 1;
                            if (newSize.Height < 1)
                                newSize.Height = 1;

                            Bitmap newBitMap = new Bitmap(newSize.Width, newSize.Height);
                            Graphics g = Graphics.FromImage(newBitMap);
              g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
              g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                            g.DrawImage(b, 0, 0, newSize.Width, newSize.Height);
                            newBitMap.Save(Path.Combine(PictureManager.LocalThumbImagePath, localFilename), imageFormat);
                            newBitMap.Dispose();
                            b.Dispose();
                        }
                    }
                }
            }
            url = CommonHelper.GetStoreLocation(false) + "images/thumbs/" + localFilename;
            return url;
        }