2012-04-26 7 views
3

画像の縦横比を変更せずに画像のサイズを変更する必要があります。固定高さと幅でサイズを変更するコードがありますが、 )。私の要件に合うようにコードを変更するにはどうすればよいですか?C#:最大高さに比例して画像のサイズを変更する方法

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; 
} 

あなたの貴重な考えを提供してください。

+0

を働いこのコードの問題は何ですか? – Likurg

+0

すべての敬意を持って、親切に私の要件を通過します。このコードでは、最大の高さと最大の幅を使用していますが、高さだけを最大の数(たとえば600)に保って画像の大きさを比例的に変更する必要があるためです。 – user735647

+0

問題は何か分かりませんが、私が間違っていないと、アスペクト比を変更せずに画像のサイズを変更します。あなたは起こると予想されるものの例を追加できますか? –

答えて

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; 
} 
+0

を使用して画像のサイズを変更できました。私はそれを試してみましょう。 – user735647

+0

私は最大の高さまたは最大幅内に収まる画像の拡大縮小を防止するために追加する必要があり、辺のいずれかが大きい場合は、ポポーションを保持しながら必要な領域に収まるまでサイズを縮小します。 –

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; 
} 
+1

彼は同じコードを持っています – Likurg

+0

@Imranありがとう。私はそれを試してみましょう。 – user735647

+0

私は与えられたコード –

1

まあ、プロセスを考えて:あなたは800サイズは×600とはnewWidthにサイズを変更したいというイメージを持っている場合 は×400の高さ(プラスそれぞれのnewWidthがなるものは何でも)、あなたは比率を取得newHeight(あなたのケースではmaxHeight)を600で除算し、800にこの比率を掛けます。だから、

、あなた自身にいくつかのダイナミズムを与え、以下を得るために、(600によって800を言う)のオプションパラメータにのmaxWidthとのmaxHeightを変更する必要があり、この場合には:

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などの変数を使用できます。

+0

ありがとうございました。私はそれを試してみましょう。 – user735647

+1

問題ありません。私はそれが助けて欲しいあなたがサンゴ礁に襲われたら教えてください。別のこと:これは最大の高さに基づいているので、else if(maxWidth!= 800)もチェックして、newWidthとnewHeightをそれに応じて変更することができます。しかし、私が含めたリンクはとにかくとても便利です。 – army

0

100%

private static BitmapFrame CreateResizedImage(ImageSource source, int Max_width, int Max_height, int margin) 
{ 
    float scaleHeight = (float)Max_width/(float)source.Height; 
    float scaleWidth = (float)Max_height/(float)source.Width; 
    float scale = Math.Min(scaleHeight, scaleWidth); 

    int width = (int)(source.Width * scale); 
    int height = (int)(source.Height * scale); 


    var rect = new Rect(margin, margin, width - margin * 2, height - margin * 2); 

    var group = new DrawingGroup(); 
    RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.HighQuality); 
    group.Children.Add(new ImageDrawing(source, rect)); 

    var drawingVisual = new DrawingVisual(); 
    using (var drawingContext = drawingVisual.RenderOpen()) 
     drawingContext.DrawDrawing(group); 

    var resizedImage = new RenderTargetBitmap(
     width, height,   // Resized dimensions 
     96, 96,    // Default DPI values 
     PixelFormats.Default); // Default pixel format 
    resizedImage.Render(drawingVisual); 

    return BitmapFrame.Create(resizedImage); 
} 


//--------Main------------// 

    BitmapImage imageSource = (BitmapImage)ImagePreview.Source; 
    var NewImage= CreateResizedImage(imageSource , 300, 300, 0); 
関連する問題