【问题标题】:C# rotate bitmap 90 degreesC#将位图旋转90度
【发布时间】:2011-01-14 14:02:39
【问题描述】:

我正在尝试使用以下函数将位图旋转 90 度。它的问题是当高度和宽度不相等时它会切断部分图像。

注意returnBitmap width = original.height,它的height = original.width

谁能帮我解决这个问题或指出我做错了什么?

    private Bitmap rotateImage90(Bitmap b)
    {
        Bitmap returnBitmap = new Bitmap(b.Height, b.Width);
        Graphics g = Graphics.FromImage(returnBitmap);
        g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
        g.RotateTransform(90);
        g.TranslateTransform(-(float)b.Width / 2, -(float)b.Height / 2);
        g.DrawImage(b, new Point(0, 0));
        return returnBitmap;
    }

【问题讨论】:

    标签: c# bitmap


    【解决方案1】:

    this呢:

    private void RotateAndSaveImage(String input, String output)
    {
        //create an object that we can use to examine an image file
        using (Image img = Image.FromFile(input))
        {
            //rotate the picture by 90 degrees and re-save the picture as a Jpeg
            img.RotateFlip(RotateFlipType.Rotate90FlipNone);
            img.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
    }
    

    【讨论】:

    • 我正在旋转的位图仅用于显示目的。我从不将其保存到文件中
    • 你不需要保存它; RotateFlip 可以解决问题。您可以删除 using 并添加 return new Bitmap(img);
    • 您可能想从这里获取一些代码,以确保保存 jpeg 的质量级别高于默认的 50 stackoverflow.com/questions/1484759/…
    【解决方案2】:

    错误出现在您第一次调用TranslateTransform

    g.TranslateTransform((float)b.Width / 2, (float)b.Height / 2);
    

    这个变换需要在returnBitmap而不是b的坐标空间中,所以应该是:

    g.TranslateTransform((float)b.Height / 2, (float)b.Width / 2);
    

    或等效

    g.TranslateTransform((float)returnBitmap.Width / 2, (float)returnBitmap.Height / 2);
    

    您的第二个TranslateTransform 是正确的,因为它将在轮换之前应用。

    不过,正如 Rubens Farias 所建议的,使用更简单的 RotateFlip 方法可能会更好。

    【讨论】:

      【解决方案3】:

      我遇到了,稍加修改后我就让它工作了。我发现了一些其他的例子,并注意到一些对我来说有所不同的东西。我不得不调用 SetResolution,如果我不这样做,图像的尺寸就错误了。我还注意到高度和宽度是向后的,尽管我认为无论如何都会对非方形图像进行一些修改。我想我会为遇到这个问题的任何人发布这个,就像我遇到同样的问题一样。

      这是我的代码

      private static void RotateAndSaveImage(string input, string output, int angle)
      {
          //Open the source image and create the bitmap for the rotatated image
          using (Bitmap sourceImage = new Bitmap(input))
          using (Bitmap rotateImage = new Bitmap(sourceImage.Width, sourceImage.Height))
          {
              //Set the resolution for the rotation image
              rotateImage.SetResolution(sourceImage.HorizontalResolution, sourceImage.VerticalResolution);
              //Create a graphics object
              using (Graphics gdi = Graphics.FromImage(rotateImage))
              {
                  //Rotate the image
                  gdi.TranslateTransform((float)sourceImage.Width / 2, (float)sourceImage.Height / 2);
                  gdi.RotateTransform(angle);
                  gdi.TranslateTransform(-(float)sourceImage.Width / 2, -(float)sourceImage.Height / 2);
                  gdi.DrawImage(sourceImage, new System.Drawing.Point(0, 0));
              }
      
              //Save to a file
              rotateImage.Save(output);
          }
      }
      

      【讨论】:

      • 这仍然为我裁剪(风景)图像,使图像成为正方形,然后裁剪......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2012-11-08
      • 2014-04-27
      相关资源
      最近更新 更多