Feedback

C# - Größe eines Bildes mit mit gleichem Seitenverhältniss ändern

Veröffentlicht von am 26.04.2008
(1 Bewertungen)
Ändert die Größe eines Bildes wobei das Seitenverhältnis eingehalten wird.
Beispiel : Bild mit 30 x 60 Pixel soll auf 90 x 90 geändert werden.

Absolut = true : das Bild hat 90 x 90 Pixel, wobei das Bild nur um Faktor 1.5 vergrößert wurde (45 x 90), der Rest wird mit einer anzugebenden Farbe aufgefüllt.

Absolut = false : das Bild hat danach 45 x 90 Pixel. Mehr war nicht möglich ohne das entweder das Seitenverhältnis verändert oder eine der angebenen Maße (Width 90 bzw. Height 90) überschritten wird.

Die Funktion setzt ebenfalls auch die Hintergrundfarbe für transparente Bilder (PNG).

Mit einem Maximalen Faktor kann eine zu starke Vergrößerung verhindert werden.

Soll das Bild z.B. 900 x 900 Pixel groß werden, so sähe es nicht besonders gut aus (bei Ursprungsbild 30 x 60). Es würde der Faktor 15 verwendet werden. Mit der Angabe eines Max Faktors kann dieser z.B. auf 4 minimiert werden. Das Bild hat dann 120 x 240 Pixel (oder 240 x 240 wenn es Absolut sein soll).

Aufrufbeispiel:

pictureBox1.Image = ResizePic(img, 300, 300, true, Color.Green, -1, -1);
using System.Drawing;

/// <summary>
/// Ändert die Größe eines Bildes und setzt eine Hintergrundfarbe.
/// </summary>
/// <param name="Source">Originalbild als Image</param>
/// <param name="Width">Neue Breite in Pixel</param>
/// <param name="Height">Neue Höhe in Pixel</param>
/// <param name="Absolut">Wenn true wird ein Image mit exakt den angegebenen Maßen erstellt. Das Bild wird mittig plaziert und mit der angegebenen Farbe gefüllt. Seitenverhältnisse des Bildes selbst bleiben erhalten. Wenn False dann wird entsprechend dem kleinem Faktor das neue Bild berechnet (neues Bild hat dann aber ggfs. NICHT die angegebenen Maße!)</param>
/// <param name="Fill">Füllfarbe für Hintergrund (vorallem wichtig bei Absolut = true oder Transparenten Bildern (PNG)</param>
/// <param name="MaxFactorX">Maximaler Vergrößerungsfaktor X-Achse. Wenn aus Width = 10 z.B. 1000 werden soll, so kann der Wert 2 ein maximales verdoppeln ermöglichen. Das Bild hat dann Width = 20. -1 bedeutet kein Mindestfaktor</param>
/// <param name="MaxFactorY">Maximaler Vergrößerungsfaktor Y-Achse. Wenn aus Height = 10 z.B. 1000 werden soll, so kann der Wert 2 ein maximales verdoppeln ermöglichen. Das Bild hat dann Height = 20. -1 bedeutet kein Mindestfaktor</param>
/// <returns>Bitmap / Image</returns>
private static Image ResizePic(Image Source, int Width, int Height, bool Absolut, Color Fill, double MaxFactorX, double MaxFactorY)
{
    if (Source != null)
    {
        // Faktoren für X und Y Achse berechnen
        double dblFaktorX = (double)Width / (double)Source.Width;
        if (dblFaktorX > MaxFactorX & MaxFactorX > -1)
        {
            Width = (int)((double)Source.Width * MaxFactorX);
            dblFaktorX = MaxFactorX;
        }

        double dblFaxtorY = (double)Height / (double)Source.Height;
        if (dblFaxtorY > MaxFactorY & MaxFactorY > -1)
        {
            Height = (int)((double)Source.Height * MaxFactorY);
            dblFaxtorY = MaxFactorY;
        }

        // kleinern Faktor benutzen
        double dblFaktorUse;
        if (dblFaktorX < dblFaxtorY)
            dblFaktorUse = dblFaktorX;
        else
            dblFaktorUse = dblFaxtorY;

        int intNewX = (int)((double)Source.Width * dblFaktorUse);
        int intNewY = (int)((double)Source.Height * dblFaktorUse);

        Bitmap objNewImage;
        int intPosX, intPosY;

        if (Absolut)
        {
            objNewImage = new Bitmap(Width, Height);
            intPosX = (Width - intNewX) / 2;
            intPosY = (Height - intNewY) / 2;
        }
        else
        {
            objNewImage = new Bitmap(intNewX, intNewY);
            intPosX = 0;
            intPosY = 0;
        }

        using (Graphics objGfx = Graphics.FromImage(objNewImage))
        {
            objGfx.FillRectangle(new SolidBrush(Fill), 0, 0, objNewImage.Width, objNewImage.Height);
            objGfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            objGfx.DrawImage(Source, new Rectangle(intPosX, intPosY, intNewX, intNewY));
        }
        return objNewImage;
    }
    else
        return null;
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!