2011-01-10 7 views
1

Ich benutze einfache re-size-Methode, um meine Bitmap auf neue Größe zu ändern. Die ursprüngliche Bitmap-Größe ist 320x240 und i Ändern Sie die Größe zweimalNach Resize Bitmap ist das Ergebnis der neuen Bitmap glatt Bitmnap

  • Um 250x160
  • auf der Bitmap einen Prozess Doing
  • es ändern zurück zu 320x240

Ich fand heraus, dass nach ich ändere es zurück zu 320x240 ich sehe, dass die Bitmap wenig glatt ist und nicht wie ich ausgenommen bin.

Wie kann ich vermeiden, dass diese glatte erscheint?

Die Resize-Methode:

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

Skalieren des Bildes wird immer in einem gewissen Mangel an Qualität führen würde. Warum würdest du es kleiner machen und es dann wieder auf die ursprüngliche Größe ändern? Es ist auch unklar, ob Sie versuchen, den Glättungseffekt zu vermeiden oder sich zu fragen, warum Ihr Bild an Qualität verloren hat. –

Antwort

2

Da Sie den Interpolationsmodus HighQualityBicubic verwenden, wird das Bild mit der höchstmöglichen Qualität vorgefiltert und in der Größe angepasst, was zu dem "Glättungseffekt" führt.

können Sie versuchen, die InterpolationMode Eigenschaft auf NearestNeighbor Setzen eines „gröberen“ Ergebnis zu erhalten:

Bitmap b = new Bitmap(destWidth, destHeight); 
using (Graphics g = Graphics.FromImage((Image) b)) { 
    g.InterpolationMode = InterpolationMode.NearestNeighbor; 
    g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
} 
+0

Danke, aber ich versuche, den InterpolationsMode zu ändern - das hilft nicht :( – Yanshof

+0

Ja, das ist die Antwort, die ich auch posten wollte, da er sagt: "Wie kann ich vermeiden, dass dieser glatte erscheint?" Aber das war natürlich ein Übersetzungsfehler. Konnte keine Antwort bekommen, wenn ich gefragt habe. Wie auch immer, +1 von mir. –

5

Das Traurige daran ist, dass Sie nicht können. Wenn Sie Ihre Bitmap auf eine kleinere Größe verkleinern, gehen Informationen verloren. Und die Information wird von dem kleinen Bild (mit weniger Informationen) interpoliert, um das neue redimensionierte Bild mit der Originalgröße zu erzeugen. Es ist diese Interpolation, die dem resultierenden Bild seinen glatten Aspekt verleiht.

Um dies zu vermeiden, ist das einzige, was Sie tun können, einen Weg zu finden, die Verarbeitung durchzuführen, ohne Ihr Bild als Teil Ihres Prozesses zu verkleinern.