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);
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.
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");
}
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.
@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.
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.
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);
}