it-swarm-eu.dev

Ändern der Bildgröße ohne Qualitätsverlust

Ich muss die Größe eines Bildes ändern, aber die Bildqualität kann dadurch nicht beeinträchtigt werden.

104
public static

Wie rcar sagt, können Sie nicht ohne Qualitätsverlust, das Beste, was Sie in c # tun können, ist:

Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
    gr.SmoothingMode = SmoothingMode.HighQuality;
    gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
    gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
    gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
211
Kris Erickson

Wenn Sie keine Vektorgrafiken erstellen, können Sie die Größe eines Bilds nicht ändern, ohne die Bildqualität zu beeinträchtigen.

32
Randy
private static Image resizeImage(Image imgToResize, Size size)
{
    int sourceWidth = imgToResize.Width;
    int sourceHeight = imgToResize.Height;

    float nPercent = 0;
    float nPercentW = 0;
    float nPercentH = 0;

    nPercentW = ((float)size.Width / (float)sourceWidth);
    nPercentH = ((float)size.Height / (float)sourceHeight);

    if (nPercentH < nPercentW)
        nPercent = nPercentH;
    else
        nPercent = nPercentW;

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

    Bitmap b = new Bitmap(destWidth, destHeight);
    Graphics g = Graphics.FromImage((Image)b);
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
    g.Dispose();

    return (Image)b;
}

von hier

24
ozba

Ich glaube, Sie möchten Ihre Bilder "Resize/Resample" machen. Hier ist eine gute Seite, die Anweisungen gibt und eine Utility-Klasse bereitstellt (die ich zufällig auch benutze):

http://www.codeproject.com/KB/GDI-plus/imgresizoutperfgdiplus.aspx

5
Ashlocke

Sie können die Größe eines Bildes nicht ändern, ohne an Qualität zu verlieren, nur weil Sie die Anzahl der Pixel verringern.

Reduzieren Sie nicht die Größe des Clients, da die Größe der Bilder von Browsern nicht gut angepasst werden kann.

Sie können die Größe programmgesteuert ändern, bevor Sie sie rendern oder wenn ein Benutzer sie hochlädt.

In diesem Artikel wird eine Möglichkeit erläutert, dies in c # zu tun: http://www.codeproject.com/KB/GDI-plus/imageresize.aspx

3
AaronS

Wenn Sie die Größe nicht ändern, können Sie dies nicht mit Rastergrafiken tun.

Mit einer guten Filter- und Glättungsfunktion können Sie die Größe ändern, ohne die erkennbare Qualität zu verlieren.

Sie können auch die DPI-Metadaten des Bilds ändern (vorausgesetzt, dass einige vorhanden sind), wodurch die Pixelzahl exakt gleich bleibt, aber die Sichtweise der Bildeditoren bei Messungen in der Praxis geändert wird.

Und nur um alle Grundlagen abzudecken, wenn Sie wirklich nur die Dateigröße des Bildes und nicht die tatsächlichen Bildabmessungen gemeint haben, schlage ich vor, dass Sie eine verlustfreie Codierung der Bilddaten in Betracht ziehen. Mein Vorschlag hierfür wäre, das Bild als PNG-Datei erneut zu speichern (ich verwende Paint in der Regel als kostenlosen Transcoder für Bilder in Windows. Bild in Paint laden, im neuen Format speichern).

3
workmad3

Sehen Sie, ob Ihnen die Bildgröße dieses Open-Source-ASP.NET-Moduls gefällt. Es gibt eine Live-Demo, mit der Sie selbst herumspielen können. Es liefert Ergebnisse, die (für mich) nicht von der Photoshop-Ausgabe zu unterscheiden sind. Es hat auch ähnliche Dateigrößen - MS hat gute Arbeit mit ihrem JPEG-Encoder geleistet.

2
Nathanael Jones

Es gibt da draußen etwas, das die Größe des Kontexts berücksichtigt. Sie wissen nicht, ob Sie es verwenden können, aber es lohnt sich, es sich anzusehen, das ist sicher

Eine nette Videodemo (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 übertrieben? Möglicherweise gibt es einige einfache Filter, die Sie auf ein vergrößertes Bild anwenden können, um die Pixel ein wenig zu verwischen.

1
Victor

Hier finden Sie auch Wasserzeichencodes 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>();
        }

    }
1
cagin

Ändern Sie die Größe größer oder kleiner? Um ein kleines Prozent oder um einen größeren Faktor wie 2x, 3x? Was verstehen Sie unter Qualität für Ihre Anwendung? Und welche Art von Bildern - Fotografien, scharfkantige Strichzeichnungen oder was? Schreiben Sie Ihren eigenen einfachen Pixel-Schleifcode oder versuchen Sie, dies mit vorhandenen Bibliotheken (.net oder was auch immer) so oft wie möglich zu tun?

Zu diesem Thema gibt es einen großen Wissensschatz. Das Schlüsselkonzept ist die Interpolation.

Browsing-Empfehlungen:
* 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 Java-spezifisch, kann aber lehrreich sein http://today.Java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance. html

1
DarenW

Hier ist ein Forenthread , der ein Beispiel für die Größenänderung von C # -Bildern bereitstellt. Sie können einen der Gd-Bibliothek Binder verwenden, um ein Resampling in C # durchzuführen.

0
jimg