112 Stimmen

Größenänderung eines Bildes ohne Qualitätsverlust

Wie kann ich die Größe eines Bildes ändern, ohne dass die Bildqualität beeinträchtigt wird?

0 Stimmen

Können Sie uns mehr Details nennen? Wie groß sind Ihre Bilder und in welcher Größe benötigen Sie sie?

5 Stimmen

6 Stimmen

bilder-grössen.net - Diese Bibliothek erzeugt die hochwertigsten Bilder, die man mit .NET bekommen kann

3voto

workmad3 Punkte 24502

Bei Rastergrafiken ist dies nicht möglich, es sei denn, Sie ändern die Größe.

Mit einer guten Filterung und Glättung können Sie die Größe ändern, ohne etwas zu verlieren. Auffallend Qualität.

Sie können auch die DPI-Metadaten des Bildes ändern (sofern sie vorhanden sind), wodurch die Pixelzahl exakt gleich bleibt, sich aber die Auffassung der Bildbearbeitungsprogramme in Bezug auf "reale" Messungen ändert.

Wenn Sie wirklich nur die Dateigröße des Bildes und nicht die tatsächlichen Bildabmessungen meinen, schlage ich vor, dass Sie eine verlustfreie Kodierung der Bilddaten in Erwägung ziehen. Mein Vorschlag dazu wäre, das Bild als .png-Datei zu speichern (ich verwende Paint als kostenlosen Transcoder für Bilder in Windows. Laden Sie das Bild in Paint, speichern Sie es im neuen Format)

2voto

Sehen Sie, ob Ihnen die Qualität der Bildgrößenänderung dieses Open-Source-ASP.NET-Moduls. Es gibt eine Live-Demo, so dass Sie selbst damit herumspielen können. Die Ergebnisse sind (für mich) nicht von der Photoshop-Ausgabe zu unterscheiden. Auch die Dateigrößen sind ähnlich - MS hat bei seinem JPEG-Encoder gute Arbeit geleistet.

0 Stimmen

Nun, JPEG ist ein relativ unkompliziertes Format. Es gibt nicht viel, was man tun kann, um Referenzimplementierungen in Bezug auf Qualität/Dateigröße zu übertreffen, da es sich am Ende nur um DCT-Koeffizienten mit allgemeiner Komprimierung handelt.

2voto

cagin Punkte 5411

Hier finden Sie auch Codes zum Hinzufügen von Wasserzeichen in dieser Klasse:

public class ImageProcessor
    {
        public Bitmap Resize(Bitmap image, int newWidth, int newHeight, string message)
        {
            try
            {
                Bitmap newImage = new Bitmap(newWidth, Calculations(image.Width, image.Height, newWidth));

                using (Graphics gr = Graphics.FromImage(newImage))
                {
                    gr.SmoothingMode = SmoothingMode.AntiAlias;
                    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    gr.DrawImage(image, new Rectangle(0, 0, newImage.Width, newImage.Height));

                    var myBrush = new SolidBrush(Color.FromArgb(70, 205, 205, 205));

                    double diagonal = Math.Sqrt(newImage.Width * newImage.Width + newImage.Height * newImage.Height);

                    Rectangle containerBox = new Rectangle();

                    containerBox.X = (int)(diagonal / 10);
                    float messageLength = (float)(diagonal / message.Length * 1);
                    containerBox.Y = -(int)(messageLength / 1.6);

                    Font stringFont = new Font("verdana", messageLength);

                    StringFormat sf = new StringFormat();

                    float slope = (float)(Math.Atan2(newImage.Height, newImage.Width) * 180 / Math.PI);

                    gr.RotateTransform(slope);
                    gr.DrawString(message, stringFont, myBrush, containerBox, sf);
                    return newImage;
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }

        public int Calculations(decimal w1, decimal h1, int newWidth)
        {
            decimal height = 0;
            decimal ratio = 0;

            if (newWidth < w1)
            {
                ratio = w1 / newWidth;
                height = h1 / ratio;

                return height.To<int>();
            }

            if (w1 < newWidth)
            {
                ratio = newWidth / w1;
                height = h1 * ratio;
                return height.To<int>();
            }

            return height.To<int>();
        }

    }

1voto

Victor Punkte 9160

Es gibt etwas da draußen, kontextbezogene Größenanpassung, ich weiß nicht, ob Sie es verwenden können, aber es ist einen Blick wert, das ist sicher

Eine schöne Video-Demo (die Vergrößerung erscheint in der Mitte) http://www.youtube.com/watch?v=vIFCV2spKtg

Hier könnte es einen Code geben. http://www.semanticmetadata.net/2007/08/30/content-aware-image-resizing-gpl-implementation/

War das zu viel des Guten? Vielleicht gibt es einfache Filter, die Sie auf ein vergrößertes Bild anwenden können, um die Pixel etwas unschärfer zu machen, das könnten Sie ausprobieren.

0 Stimmen

Ich vermute, es hat nichts mit der ursprünglichen Frage zu tun, aber ich liebe diese Technik.

1voto

DarenW Punkte 16149

Vergrößern oder verkleinern Sie die Größe? Um einen kleinen Prozentsatz oder um einen größeren Faktor wie 2x, 3x? Was verstehen Sie unter Qualität für Ihre Anwendung? Und um welche Art von Bildern handelt es sich - Fotografien, scharfkantige Strichzeichnungen oder was? Schreiben Sie Ihren eigenen Low-Level-Pixelschleifcode oder versuchen Sie, so viel wie möglich mit vorhandenen Bibliotheken (.net oder was auch immer) zu machen?

Zu diesem Thema gibt es einen umfangreichen Wissensfundus. Das Schlüsselkonzept ist die Interpolation.

Empfehlungen zum Browsing:
* http://www.all-in-one.ee/~dersch/interpolator/interpolator.html
* http://www.cambridgeincolour.com/tutorials/image-interpolation.htm
* für C#: https://secure.codeproject.com/KB/GDI-plus/imageprocessing4.aspx?display=PrintAll&fid=3657&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26&select=629945 * Dies ist zwar Java-spezifisch, könnte aber lehrreich sein - http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X