Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von johannes0405
Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

So gestern Abend im Bett ist mir die entscheidende Lösung eingefallen.
Die Standard Windows Auflösung ist ja 96 DPI. Deswegen funktioniert es auch mit Bildern die eine Auflösung von 96 DPI besitzen.
Die Bilder mit einer abweichenden Auflösung muss ich also auf die DPI runterrechnen.
D. h. x, y, width und height des Rectangles für den Bildausschnitt müssen angepasst werden auf die Auflösung des Bildes.
Mache ich jetzt wie folgt:
Beispiel anhand der Width:


var widthneu = (int)((rectangle.Width / 96.0) * image1.Metadata.HorizontalResolution);

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

Nene, ich probiere und lese mich da schon seit mehr als einer Woche durch.
Ich verstehe mehr oder weniger das System, ich verstehe nur nicht, warum es bei dem einen Bild klappt und beim anderen nicht.

Und dass das Quellbild nicht größer als das Rectangle sein kann ist klar, wenn man die Größe auf die des Rectangles setzt. Hatte nur das Feedback zu deinem T-Virus weitergeben wollen.
Weil ich schon vieles probiert habe, klammere ich mich mittlerweile an jeden Strohhalm.

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

@T-Virus:
Wenn ich das mache, bekomme ich folgenden Fehler:
"Crop rectangle should be smaller than the source bounds."

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

Entschuldige, bin auf dem Gebiet auch relativ neu.
Das hatte ich bereits versucht. Macht keinen Unterschied.
Vllt noch ein paar mehr Details

Hier der aktuelle Quellcode:


using (var inStream = new MemoryStream(bildByte))
                using (var outStream = new MemoryStream())                    
                using (var image1 = SixLabors.ImageSharp.Image.Load(inStream, out IImageFormat format))
                {                         
                    
                    image1.Mutate(
                        i => i.Resize(image1.Width, image1.Height)
                              .Crop(new SixLabors.ImageSharp.Rectangle(x, y, width, height)));
                   
                    image1.Save("C:\\Users\\User\\Pictures\\Scans\\test.jpeg");            
                }

Ich habe auch nochmal die Bilder angehangen.

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

Edit:
Mit der ImageSharp habe ich es nun ans Laufen bekommen.
Jedoch habe ich hier die gleichen Probleme wie zuvor.
Einige Bilder lassen sich korrekt croppen und einige croppen an falscher Stelle.
Die, bei denen es klappt haben eine Auflösung von 96.

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

@Abt:
Ich habe es jetzt auch mal mit Imagesharp versucht.
Ein Problem habe ich jetzt nur:
Wenn ich das Bild speichere, wird mir angezeigt, dass Dateiformat nicht unterstützt wird.

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

Mein Code sieht nun wie folgt aus:


 public Image cropImage(Image img, Rectangle cropArea)
        {           
            Bitmap bmpImage = new Bitmap(cropArea.Width, cropArea.Height);
            bmpImage.SetResolution(800, 800);

            using(var g = Graphics.FromImage(bmpImage))
            {
                g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

                using (var wrapMode = new ImageAttributes())
                {
                    wrapMode.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY);
                    g.DrawImage(img, cropArea, 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, wrapMode);
                }
            }
                        
#if DEBUG
            bmpImage.Save("C:\\Users\\User\\Pictures\\Scans\\test.jpg", ImageFormat.Jpeg);
#endif
            return bmpImage;
        }
Derzeit speichere ich das Bild nur erstmal in einem Verzeichnis ab.
Die Funktion liefert nun bei mir in keinem Fall ein brauchbares Ergebnis.

Folgendes wäre ggf. noch gut zu wissen:
Die Rectangles zum freistellen stammen bei mir wahlweise aus der Azure Gesichtserkennung oder werden freihand auf ein Canvas gezeichnet, welches das Image im Hintergrund hat.

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

@T-Virus: Danke für deine Antwort, hat leider keine Abhilfe geschaffen.

Thema: Freistellen eines Bitmap klappt bei einigen Bildern nicht
Am im Forum: Grafik und Sound

Guten Abend zusammen,
ich hänge jetzt schon seit einigen Tagen an der Freistellung eines Bitmaps fest.
Ich möchte anhand eines Rectangles ein Gesicht ausschneiden.
Dies mache ich mit Bitmap.Clone().
Bei einigen Bildern kappt es auch, bei einigen jedoch nicht. Der Ausschnitt ist viel zu klein.
Mir ist aufgefallen, dass es immer bei Bildern klappt, bei denen keine Informationen zur Auflösung gespeichert sind.

Gibt es einen Weg, die Auflösung zu berücksichtigen? Bitmap.SetResolution bringt nichts.
Hier mein Code:


public Image cropImage(Image img, Rectangle cropArea)
        {                           
            Bitmap bmpImage = new Bitmap(img);
            bmpImage.SetResolution(800, 800);                        
            return bmpImage.Clone(cropArea, bmpImage.PixelFormat);
        }
Viele Grüße,