Recently I had to automatically resize images, but I ran into problem that some images were rotated. Problem was the EXIF data on some of the images was altering the orientation of the images. As explained here. So here is my method for image resizing:
    public void ResizeImage(string originalFilename, string saveTo,
                     int canvasWidth, int canvasHeight)
    {
      try
      {
        Image image = Image.FromFile(originalFilename);

        Image thumbnail = new Bitmap(canvasWidth, canvasHeight);
        Graphics graphic = Graphics.FromImage(thumbnail);

        graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphic.SmoothingMode = SmoothingMode.HighQuality;
        graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
        graphic.CompositingQuality = CompositingQuality.HighQuality;

        int originalWidth = image.Width;
        int originalHeight = image.Height;

        double ratioX = canvasWidth / (double)originalWidth;
        double ratioY = canvasHeight / (double)originalHeight;

        double ratio = ratioX < ratioY ? ratioX : ratioY;

        int newHeight = Convert.ToInt32(originalHeight * ratio);
        int newWidth = Convert.ToInt32(originalWidth * ratio);

        int posX = Convert.ToInt32((canvasWidth - (originalWidth * ratio)) / 2);
        int posY = Convert.ToInt32((canvasHeight - (originalHeight * ratio)) / 2);

        graphic.Clear(Color.White); // white padding

        graphic.DrawImage(image, posX, posY, newWidth, newHeight);

        ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
        EncoderParameters encoderParameters;
        encoderParameters = new EncoderParameters(1);
        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality,
                         100L);

        int OrientationKey = 0x0112;
        const int NotSpecified = 0;
        const int NormalOrientation = 1;
        const int MirrorHorizontal = 2;
        const int UpsideDown = 3;
        const int MirrorVertical = 4;
        const int MirrorHorizontalAndRotateRight = 5;
        const int RotateLeft = 6;
        const int MirorHorizontalAndRotateLeft = 7;
        const int RotateRight = 8;

        if (image.PropertyIdList.Contains(OrientationKey))
        {
          if (image.PropertyIdList.Contains(OrientationKey))
          {
            var orientation = (int)image.GetPropertyItem(OrientationKey).Value[0];
            switch (orientation)
            {
              case NotSpecified: // Assume it is good.
              case NormalOrientation:
                // No rotation required.
                break;
              case MirrorHorizontal:
                thumbnail.RotateFlip(RotateFlipType.RotateNoneFlipX);
                break;
              case UpsideDown:
                thumbnail.RotateFlip(RotateFlipType.Rotate180FlipNone);
                break;
              case MirrorVertical:
                thumbnail.RotateFlip(RotateFlipType.Rotate180FlipX);
                break;
              case MirrorHorizontalAndRotateRight:
                thumbnail.RotateFlip(RotateFlipType.Rotate90FlipX);
                break;
              case RotateLeft:
                thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone);
                break;
              case MirorHorizontalAndRotateLeft:
                thumbnail.RotateFlip(RotateFlipType.Rotate270FlipX);
                break;
              case RotateRight:
                thumbnail.RotateFlip(RotateFlipType.Rotate270FlipNone);
                break;
              default:
                throw new NotImplementedException("An orientation of " + orientation + " isn't implemented.");
            }
          }
        }

        //thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone);
        thumbnail.Save(saveTo, info[1], encoderParameters);
        Debug.WriteLine($"Thumbnail from file: {originalFilename} created in {saveTo}");
      }
      catch (Exception e)
      {
        Debug.WriteLine($"Error creating thumbnail: {e.Message}");
      }
    }
POI:
int OrientationKey = 0x0112;
const int NotSpecified = 0;
const int NormalOrientation = 1;
const int MirrorHorizontal = 2;
const int UpsideDown = 3;
const int MirrorVertical = 4;
const int MirrorHorizontalAndRotateRight = 5;
const int RotateLeft = 6;
const int MirorHorizontalAndRotateLeft = 7;
const int RotateRight = 8;

if (image.PropertyIdList.Contains(OrientationKey))
{
  if (image.PropertyIdList.Contains(OrientationKey))
  {
	var orientation = (int)image.GetPropertyItem(OrientationKey).Value[0];
	switch (orientation)
	{
	  case NotSpecified: // Assume it is good.
	  case NormalOrientation:
		// No rotation required.
		break;
	  case MirrorHorizontal:
		thumbnail.RotateFlip(RotateFlipType.RotateNoneFlipX);
		break;
	  case UpsideDown:
		thumbnail.RotateFlip(RotateFlipType.Rotate180FlipNone);
		break;
	  case MirrorVertical:
		thumbnail.RotateFlip(RotateFlipType.Rotate180FlipX);
		break;
	  case MirrorHorizontalAndRotateRight:
		thumbnail.RotateFlip(RotateFlipType.Rotate90FlipX);
		break;
	  case RotateLeft:
		thumbnail.RotateFlip(RotateFlipType.Rotate90FlipNone);
		break;
	  case MirorHorizontalAndRotateLeft:
		thumbnail.RotateFlip(RotateFlipType.Rotate270FlipX);
		break;
	  case RotateRight:
		thumbnail.RotateFlip(RotateFlipType.Rotate270FlipNone);
		break;
	  default:
		throw new NotImplementedException("An orientation of " + orientation + " isn't implemented.");
	}
  }
}
With this code I was checking if image has to be rotated. Example application (at this moment still under development), you can see on my GitHub.

---

UPDATE 2024-04-06 Note that Image and are I disposable, so correct way would be:

    public void ResizeImage(string originalFilename, string saveTo,
                     int canvasWidth, int canvasHeight)
    {
      try
      {
        using (Image image = Image.FromFile(originalFilename))
        using (Image thumbnail = new Bitmap(canvasWidth, canvasHeight))
        using (Graphics graphic = Graphics.FromImage(thumbnail))
        {
...
Otherwise image file will stay locked.