| |
VB.NET - Ein- und UmsteigerRe: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Bazi | Datum: 12.02.15 12:34 |
| das funktioniert aber nur wenn das Bild komplett sichtbar ist.
Wenn ich nur einen Ausschnitt sichtbar habe, und quasi drehen möchte dass die Mitte des sichtbaren Bereiches nach dem Drehen wieder in der Mitte ist, dann werde ich ums verschieben wohl nicht rumkommen.
Danke für die Hilfe
Gruß Christian | |
obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Bazi | Datum: 12.02.15 08:46 |
| Hallo,
wenn ich in einer Picturebox das Bild mit RotateFlip um 90° drehe, verändert sich doch mein oben links dargestellter Bildpunkt. Wie kann ich den ermitteln? Die MS-Beschreibung schweigt sich hierüber aus.
Beispielsweise, wenn ich vor der Drehung eine Bildposition oben links von 50/80 hatte,nennen wir das mal ScrollPos. Wie ermittle ich die neue nach der Drehung?
Gruß Christian
Danke für die Hilfe
Gruß Christian | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Manfred X | Datum: 12.02.15 09:19 |
| Hallo!
Ich vermute, die Angaben zur Bildposition (50/80) sind Distanzangaben
relativ zur linken oberen Ecke des Bildes.
Bei Drehungen mit Rotateflip versetzt Du diese Ecke.
Von der neuen Eckposition aus wird über die Distanzwerte
die neue Position des Punktes berechnet.
| |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Bazi | Datum: 12.02.15 09:33 |
| Hallo, ja das sind Distanzwerte.
Das ist der ausgeblendete oder ungenutzte Teil des Bildes.
Wenn ich das versetze, dann hieße das, die sind dann bei einer Drehung nach rechts nicht mehr in Relation zur linken ober Ecke, sondern dann zur rechten oberen Ecke.
Also müsste sich die neue Scrollposition berechnen lassen aus der alten ScrollPosition sowie den Abmessungen der Zeichnung.
Somit müsste die neue ScrollPosition nach einer Rechtsdrehung sein:
Höhe der Zeichnung - alteScrollPos.left / AlteScrollPos.top - Breite der Zeichnung ?
Oder hab ich da nen Denkfehler?
Danke für die Hilfe
Gruß Christian | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Manfred X | Datum: 12.02.15 09:50 |
| Warum denken?
Hier ein wenig Code zum Ausprobieren.
Public Sub TestRotation()
'Bitmap erstellen
Dim bmp As New Bitmap(200, 500, Imaging.PixelFormat.Format24bppRgb)
'Die Farbe des kritischen Punktes definieren
Dim ckrit As Color = Color.FromArgb(125, 125, 125)
'Den kritischen Punt farbig markieren
bmp.SetPixel(60, 170, ckrit)
'Gewünschte Dreh-/Kipp-Bewegubng ausführen
bmp.RotateFlip(RotateFlipType.Rotate90FlipNone)
'Suche nach der neuen Position
For i As Integer = 0 To bmp.Width - 1
For k As Integer = 0 To bmp.Height - 1
If bmp.GetPixel(i, k) = ckrit Then Stop
Next k
Next i
End Sub | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Bazi | Datum: 12.02.15 10:57 |
| Danke,
gedreht wird immer über den Mittelpunkt? Oder gibt es da Unterschiede?
Danke für die Hilfe
Gruß Christian | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Manfred X | Datum: 12.02.15 11:10 |
| Das kommt auf die verwendete Methode an.
Die RotateFlip-Methoden der Bitmap vertauschen
bei rechtwinkligen Bildern Höhe und Breite -
das Bild startet immer bei 0/0 - insofern liegt
hier nur bei quadratischen Bildern eine reine Drehung/Kippung
um die Bildmitte vor; sonst wird zusätzlich eine Verschiebung
an den linken/oberen Rand vorgenommen.
Bei der RotateAt-Methode der Drawing2D.Matrix kann der
Drehmitelpunkt explizit angegeben werden.
Beitrag wurde zuletzt am 12.02.15 um 11:13:00 editiert. | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Bazi | Datum: 12.02.15 11:36 |
| Gut zu wissen. Vermutlich ist aber RotateFlip schneller? Da ich mit großen Bitmaps arbeite ist das ein Thema (Pläne in DIN-A0)
Weil ich als Anwender erwarten würde dass bei einer Drehung der Bildschirmmittelpunkt der Drehpunkt ist, muss ich da also einige weitere Faktoren berechnen und das Bild nach der Drehung wieder entsprechend verschieben.
Das ist doch wesentlich komplexer als ich dachte.
Danke für die Hilfe
Gruß Christian | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Manfred X | Datum: 12.02.15 12:19 |
| Wenn Deine Pläne nicht quadratisch sind, füge geeignete Ränder
in der Bitmap an, damit sie in der Gesamt-Abmessung quadratisch wird.
RotateFlip dreht dann um den Mittelpunkt.
DIN A0: 841mm × 1189mm --> 174 mm Breiter Rand (links und rechts).
Was diese Zahlen in Pixel bedeuten, entnimmst Du den
Resolution-Eigenschaften bzw. den Width/Height-Eigenschaften der Bitmap.
Beitrag wurde zuletzt am 12.02.15 um 12:24:12 editiert. | |
Re: obere linke Ecke des Bildes nach Drehung ermitteln | | | Autor: Manfred X | Datum: 12.02.15 20:48 |
| Die RotateFlip-Methode der Bitmap dreht immer die gesamten Bild-Daten, die die Bitmap enthält.
In einem Control angezeigte Ausschnitte werden dabei nicht berücksichtigt.
Den korrespondierenden Ausschnitt mußt Du danach neu berechnen.
Vielleicht helfen Dir dabei diese Routinen ...
Private Function ComputeRotatedPoint(ByVal p As Point, _
ByVal width As Integer, ByVal height As Integer, _
ByVal rf As RotateFlipType) As Point
'p Punkt in der unrotierten Bitmap
'Width, Height Abmessungen der unrotierten Bitmap
'Rückgabe: Position des Punktes p in der rotierten Bitmap
Dim ret As Point
Select Case rf
Case RotateFlipType.Rotate90FlipNone
ret = New Point(height - p.Y - 1, p.X)
Case RotateFlipType.Rotate180FlipNone
ret = New Point(width - p.X - 1, height - p.Y - 1)
Case RotateFlipType.Rotate270FlipNone
ret = New Point(p.Y, width - p.X - 1)
Case Else
ret = Nothing
End Select
Return ret
End Function
Private Function ComputeRotatedRectangle(ByVal rect As Rectangle, _
ByVal width As Integer, height As _
Integer, _
ByVal rf As RotateFlipType) As _
Rectangle
'Bestimmung eines Rectangle nach der Rotation
'rect Rechteck unrotiert
'width, height Abmessungen der unrotierten Bitmap
'Eckpunkte Original-Rechteck
Dim xleft As Integer = rect.X
Dim xright As Integer = rect.X + rect.Width - 1
Dim ytop As Integer = rect.Y
Dim ybottom As Integer = rect.Y + rect.Height - 1
'gegenüberliegende Eckpunkte des rotierten Rechtecks
Dim topleft As Point = _
ComputeRotatedPoint(New Point(xleft, ytop), width, height, rf)
Dim bottomright As Point = _
ComputeRotatedPoint(New Point(xright, ybottom), width, height, _
rf)
'Rectangle-Parameter ermitteln
Dim ret As New Rectangle
ret.Location = New Point(Math.Min(topleft.X, bottomright.X), _
Math.Min(topleft.Y, bottomright.Y))
ret.Size = New Size(Math.Abs(topleft.X - bottomright.X) + 1, _
Math.Abs(topleft.Y - bottomright.Y) + 1)
Return ret
End Function | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|