4

アスペクト比を変更せずに画像のサイズを比例的に変更する必要があります。固定の高さと幅でサイズを変更するコードがありますが、最大の高さ (たとえば 600 ピクセル) に比例して画像のサイズを変更する必要があります。要件に合わせてコードを変更するにはどうすればよいですか?

public static void Main()
{
  var image = Image.FromFile(@"c:\logo.png");
  var newImage = ScaleImage(image, 300, 400);
  newImage.Save(@"c:\test.png", ImageFormat.Png);
}

public static Image ScaleImage(Image image, int maxWidth, int maxHeight)
 {
  var ratioX = (double)maxWidth / image.Width;
  var ratioY = (double)maxHeight / image.Height;
  var ratio = Math.Min(ratioX, ratioY);

  var newWidth = (int)(image.Width * ratio);
  var newHeight = (int)(image.Height * ratio);

  var newImage = new Bitmap(newWidth, newHeight);
  Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
  return newImage;
}

貴重なご意見をお寄せください。

4

4 に答える 4

4

これはほとんど簡単に感じられ、何かが欠けているように感じます。とにかく、それはうまくいきませんか?

public static Image ScaleImage(Image image, int maxHeight) 
{ 
    var ratio = (double)maxHeight / image.Height; 

    var newWidth = (int)(image.Width * ratio); 
    var newHeight = (int)(image.Height * ratio); 

    var newImage = new Bitmap(newWidth, newHeight); 
    using (var g = Graphics.FromImage(newImage))
    {
        g.DrawImage(image, 0, 0, newWidth, newHeight); 
    }
    return newImage; 
} 
于 2012-04-26T07:48:05.697 に答える
1

次の関数を使用します

public Bitmap ProportionallyResizeBitmapByHeight(Bitmap imgToResize, int height)
{
  int sourceWidth = imgToResize.Width;
  int sourceHeight = imgToResize.Height;

  float scale = 0;

  scale = (height / (float)sourceHeight);

  int destWidth = (int)(sourceWidth * scale);
  int destHeight = (int)(sourceHeight * scale);

  Bitmap result = new Bitmap(destWidth, destHeight);
  result.SetResolution(imgToResize.HorizontalResolution, imgToResize.VerticalResolution);
  Graphics g = Graphics.FromImage(result);
  g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
  g.Dispose();

  return result;
}
于 2012-04-26T07:42:35.723 に答える
1

プロセスを考えてみると、サイズが 800 x 600 の画像があり、それを newWidth x 400 の高さ (およびそれぞれの newWidth が何であれ) にサイズ変更したい場合は、newHeight を割って比率を取得します (あなたの maxHeight場合) 600 で、この比率で 800 を掛けますよね?

したがって、この場合、maxWidth と maxHeight をオプションのパラメーター (たとえば 800 x 600) に変更して、ダイナミズムを与え、次のようにする必要があります。

public static Image ScaleImage(Image image, int maxWidth = 800, int maxHeight = 600)
 {

  int newWidth;
  int newHeight;
  double ratio = image.Height / image.Width;

  if(maxHeight != 600) {

     newWidth = image.Width * ratio;
     newHeight = maxHeight;

  }   

  Bitmap newImage = new Bitmap(newWidth, newHeight);
  Graphics.FromImage(newImage).DrawImage(image, 0, 0, newWidth, newHeight);
  return newImage;
}

これが役立つことを願っています。私はそれをテストしませんでしたが、VB コードを書き直したので、問題ないはずです...

ここにも ResizeStream メソッドがあります: http://forums.asp.net/t/1576697.aspx/1便利だと思います。画質を維持したい場合は、CompositingQuality や SmoothingMode などの変数を使用できます。

于 2012-04-26T07:48:13.897 に答える