Laden...

Forenbeiträge von johannes0405 Ingesamt 9 Beiträge

11.08.2021 - 13:04 Uhr

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);

10.08.2021 - 16:37 Uhr

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.

10.08.2021 - 14:40 Uhr

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

10.08.2021 - 14:02 Uhr

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.

10.08.2021 - 13:02 Uhr

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.

10.08.2021 - 09:36 Uhr

@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.

09.08.2021 - 08:08 Uhr

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.

08.08.2021 - 19:46 Uhr

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

08.08.2021 - 18:46 Uhr

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,