[gelöst] Bild um 90 Grad drehen
-
Ich habe Bilder von einer Kamera, die auf Portrait gedreht werden müssen. Mein Ansatz mit der
Image-Klasse weist einige Probleme auf.private void Image1() { int w1, h1, w2, h2; int breite = 220; double scale, wx, hx; string path1, path2; // Ein Bild im Querformat path1 = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + "\\Bild01.jpg"; FileStream fs = new System.IO.FileStream(path1, FileMode.Open, FileAccess.Read); Image image1 = System.Drawing.Image.FromStream(fs); wx = w1 = image1.Width; hx = h1 = image1.Height; label1.Text = w1.ToString() + " X " + h1.ToString(); // Auf Breite skalieren scale = wx / breite; wx /= scale; hx /= scale; w1 = (int)wx; h1 = (int)hx; label2.Text = w1.ToString() + " X " + h1.ToString(); pictureBox1.Width = w1; pictureBox1.Height = h1; pictureBox1.Image = image1; pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; // Das Bild um 90 Grad drehen Image image2 = System.Drawing.Image.FromStream(fs); // neu einlesen statt clonen! image2.RotateFlip(RotateFlipType.Rotate90FlipX); // Gedrehtes Bild an Bildschirm anpassen wx = w2 = image2.Width; hx = h2 = image2.Height; label3.Text = w2.ToString() + " X " + h2.ToString(); wx /= scale * 1.40; // ohne Faktor 1.40 Darstellung falsch! hx /= scale / 1.40; // dito w2 = (int)wx; h2 = (int)hx; pictureBox2.Width = w2; pictureBox2.Height = h2; label4.Text = w2.ToString() + " X " + h2.ToString(); pictureBox2.Image = image2; pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; // Gedrehtes Bild speichern --> Korrekturfaktor nicht berücksichtigt! path2 = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) + "\\Bild02.jpg"; image2.Save(path2, ImageFormat.Jpeg); }
1. Die korrekte Darstellung des gedrehten Bildes auf dem Bildschirm gelingt nur mit einem zusätzlichen Korrekturfaktor (~1.40).
2. Die korrekte Speicherung des gedrehten Bildes gelingt gar nicht.
3. Wie eine Kopie von image1 nach image2 erstellen?Muss ich ggfs. mit Bitmap und Graphic arbeiten?
-
Kennst du den Artikel hier? http://www.codeproject.com/Articles/58815/C-Image-PictureBox-Rotations
Der hat mir damals geholfen, als ich vor einer ähnlichen Aufgabe stand.
-
Erstens musst du "Rotate90FlipXY" verwenden, da das Bild sonst gespiegelt ist. Zweitens habe ich keine Darstellungsprobleme des gedrehten Bildes.
Auch das Speichern funktioniert Prolemlos. - Verstehe deine Größenanpassungen an den Bildern zwar nicht... aber im folgenden mein Code:
private void OpenImage_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string img = dialog.FileName; this.pbxOriginal.BackgroundImage = Image.FromFile(img); this.pbxOriginal.BackgroundImageLayout = ImageLayout.Zoom; this.pbxRotated.BackgroundImage = this.pictureBox1.BackgroundImage; this.pbxRotated.BackgroundImageLayout = ImageLayout.Zoom; } } private void RotateImage_Click(Object sender, EventArgs e) { Image img = (Image)this.pictureBox2.BackgroundImage.Clone(); img.RotateFlip(RotateFlipType.Rotate90FlipXY); this.pbxRotated.BackgroundImage = img; } private void button2_Click(object sender, EventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { Image img = (Image)this.pbxRotated.BackgroundImage; img.Save(dialog.FileName, ImageFormat.Png); } }
Am Ende kommt genau das gleiche Bild, nur 90° nach Links gedreht heraus. - Keine Probleme mit irgendwelchen Skalierungen.
-
inflames2k schrieb:
Erstens musst du "Rotate90FlipXY" verwenden, da das Bild sonst gespiegelt ist. Zweitens habe ich keine Darstellungsprobleme des gedrehten Bildes.
Auch das Speichern funktioniert Prolemlos. - Verstehe deine Größenanpassungen an den Bildern zwar nicht... aber im folgenden mein Code:
Probleme mit irgendwelchen Skalierungen.Auch dieser Code liefert bei mir dasselbe falsch rotierte Bild: Breite zu gross, Höhe zu klein. Und das gespeicherte Bild ist viel zu gross.
-
Was hast du denn für ein Bild? Wie sind die Maße? - Eventuell kriege ich ja so eine ehere Ahnung, was bei dir Schief laufen könnte / anders sein könnte als bei mir.
Habe jetzt mal ein Bild mit den Maßen 307x127 genommen, mit meinem Code gedreht und gespeichert. Heraus kam ein Bild mit den Maßen 127x307.
-
Mit
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
erhältst du natürlich verzerrte Bilder (wenn der Ratio-Wert des Bildes nicht zum Ratio-Wert der PictureBox paßt).
Solltest also besser
pictureBox2.SizeMode = PictureBoxSizeMode.Zoom;
verwenden
-
Danke für Eure Mühen.
Ich bin der Sache auf den Grund gekommen. Auf der Entwicklungsmaschine werden die
gedrehten Bilder auf dem Bildschirm mit falschem Seitenverhältnis dargestelltt und
verlangen den ominösen Korrekturfaktor 1.40 und StretchImage. Auf der Zielmaschine
Tablet ist das nicht der Fall, dort sieht alles sauber aus.Da muss man erst einmal drauf kommen! Ist wohl ein Problem der Grafikkarte und/oder
des Monitors?
-
Eventuell ist die DPI Einstellung auf dem Entwicklungssystem auch anders?