C# Beim Resizen entstehen Bildrauschen, wieso?

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Ich hab aus dem Internet ein Code zum Resizen der Bilder geholt. eine Frage... wieso bekomme ich immer komische Bildrauschen?

Code:
public 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 = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

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

            return (Image)b;
        }

Wie kann ich diesen Rauschen vermeiden?
 
Hi,

versuche doch einfach mal andere Interpolationsarten durch, vielleicht kannst du damit etwas erreichen.

Aber erwarte dir lieber nicht zu viel davon, damit wirst du bei der eingebauten Funktion fürchte ich leben müssen.

VG,
Mad
 
Qualitativ hochwertiges "Resizen" ist eine sehr anspruchsvolle Aufgabe bezüglich der eingesetzten Algorithmen. All die fertigen "Out-of-the-box" Funktionen sind rein auf Geschwindigkeit getrimmt und vernachlässigen die Qualität.

Lösung :
Nach entsprechenden Algorithmen suchen oder eine darauf spezialisierte Bibliothek erwerben.
 
wieso bekomme ich immer komische Bildrauschen?
Es wäre hilfreich wenn du ein "vorher" und ein "nachher" Bild postest, dann kann man auch versuchen die Ursache zu erklären.
Wie schon vorgeschlagen: Andere Resize-Verfahren können je nach Anwendungsfall besser geeignet sein - kubische bi-splines sind aber nicht unüblich.
ps: nen vernünftiger resize ist deutlich komplizerter als man denkt!

edit:
Nach entsprechenden Algorithmen suchen oder eine darauf spezialisierte Bibliothek erwerben.
erwerben ist unnötig - es gibt gute freeware die auch kommerziell genutzt werden darf.
zB hier:
http://hci.iwr.uni-heidelberg.de/vigra/doc/vigra/group__GeometricTransformations.html
 
Also bei mir funktioniert dein Codeschnipsel ganz wunderbar. Egal ob beim Verkleinern oder vergrößern.

Ich verwende ihn so:

Code:
            Bitmap bmp = (Bitmap)Bitmap.FromFile(@"z:\bild.jpg");
            pictureBox1.Image = (Bitmap)bmp.Clone();

            pictureBox2.Image = ResizeImage(bmp, new Size(600, 600));

Also mit 2 Bildboxen. Ich habe in der Funktion ResizeImage allerdings den ersten Parameter von Image nach Bitmap geändert, weils dann leichter zu benutzen ist.

EDIT: Auch mit deinem Beispielbild funzt es einwandfrei. Siehe Anhang. sleep.png Original und Vergrößert auf 256x256.
 

Anhänge

  • bild.png
    bild.png
    124,1 KB · Aufrufe: 219
Zuletzt bearbeitet:
Also Sleep ist Original und nachher ist nachher :D

Bitte verwirrt euch nicht. Das schwarze ist halt nur Hintergrund, was beim Original halt Transparent ist. Es ist nicht abgespeichert und der Hintergrund bezieht sich auf die Form wo das Bild abgebildet wird.
 

Anhänge

  • nachher.png
    nachher.png
    4,7 KB · Aufrufe: 150
  • sleep.png
    sleep.png
    14,4 KB · Aufrufe: 156
In diesem Fall ist die Größe Identisch... habs ja aus dem Screenshot. Es wird nicht abgespeichert. Zum Einlesen der Datei benutze ich
Image.FromFile(String)


ähm ja... wieso Liest der die Datei in 8Bit Format ein? das ist ja kommisch. Ich habe gerade mal abgespeichert um zu checken welchen Format die Datei hat. Hmm...wie kann ich den das Format wechseln?

Sollte der nicht im Originalformat alles einlesen?
 
Zuletzt bearbeitet:
Besteht das Problem jetzt beim Anzeigen oder beim erneuten Abspeichern?

Beim Abspeichern kann man noch einiges drehen in Bezug auf Bildqulität, Farbtiefe und Bildformat.
Defaultwerte sind da meist problematisch.

Welche VS-Version? Welches Framework?
 
Zuletzt bearbeitet:
So... OMG... ich dachte zuerst es liegt am Image.FromFile... aber es liegt an der andere Methode. Ich brauch den Byte[] vom Image für die DB. Hierbei wandle ich die Daten vom Array ins Image wieder um. Komischerweise werden die Daten als 24Bit (halt original Farbtiefe) abgelegt und werden ins Image falsch übersetzt.

Code:
        public Image ByteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }
        public byte[] ImageToByteArray(Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            ///Hier war statt Png Gif... ist klar wieso die Daten dann im Format von 
            ///8 Bit abgelegt wurden.
            imageIn.Save(ms, ImageFormat.Png);
            return ms.ToArray();
        }

Sollte man die Datei im ms als Tiff ablegen?
 
Zuletzt bearbeitet:
Ich denke es ist alles in Butter wenn Quellformat immer gleich Zielformat ist.
Ansonsten würde ich sagen dass TIFF recht schnell recht groß werden kann.

Für MemoryStreams würde sich IMHO das MemoryBMP-Format anbieten.

Ich würd mir vielleicht sogar das ganze Formatierungszeugs sparen und direkt die Bilddatei als Bytearray laden und nicht als Image. Dann wandelt man das halt nur bei Bedarf in ein echtes Bildobjekt.
ist natürlich Situationsabhängig.
 
Zuletzt bearbeitet:
ich denke ich belasse es auf PNG. Für MemoryBmp braucht der noch Incoder Parameter. Bei BMP kann er den Transparenten Hintergrund aber nicht darstellen, komischerweise. Es wird dann alles was transparent ist auf Schwarz gestellt.
 
MacGyver schrieb:
Ich denke es ist alles in Butter wenn Quellformat immer gleich Zielformat ist.
Solange man verlustfrei komprimierte Format nimmt, ja. Wird verlustbehaftet komprimiert, so kommt nach dem entpacken ins Image (was BMP ist) und erneutem verlustbehafteten komprimieren eine schlechtere Qualität heraus.
 

Ähnliche Themen

Antworten
9
Aufrufe
5.693
Zurück
Oben