| |
Fortgeschrittene ProgrammierungFunction ImageRotate | | | Autor: Dikn | Datum: 27.09.17 13:34 |
| wie kann ich ein Bild um z.B. 5 Grad zentral drehen?
Ähnlich wie in "Picasa 3" -> Ausrichtung
Bitte ein Beispiel | |
Re: Function ImageRotate | | | Autor: Franki | Datum: 28.09.17 01:14 |
| Hallo,
bitte beschreibe doch mal etwas genauer was du machen möchtest, bzw. mit welcher VB Version du überhaupt arbeitest.
Bilder (oder sonst was) zu drehen per Code beinhaltet immer im Funktionsaufruf die Parameter die den Winkel und den Drehpunkt bestimmen, das kann jedes Grafikprogramm. Sei es, dass es über VBA angesprochen werden kann wie z.B. Corel.
Gruß
Frank | |
Re: Function ImageRotate | | | Autor: VB3-Guru | Datum: 08.02.18 16:03 |
| Ich nehme an, er will das Bild im Code drehen
http://www.activevb.de/tipps/vb6tipps/tipp0223.html
Is ja nicht gerade neu | |
Re: Function ImageRotate | | | Autor: Franki | Datum: 09.02.18 03:17 |
| Hallo,
und weil das eben nicht neu ist habe ich nachgefragt was genau beabsichtigt ist. Auch in deinem Beispiel müssen Mittelpunkt und Winkel der Drehung als Parameter angegeben werden. Ob per Code oder Aufruf der Parameter für einen vorhandenen Code bleibt gleich von der Funktionsweise. Welche Software das erledigt spielt dabei keine Rolle.
Aber gut, es wurde vom OP keine Antwort gegeben, vielleicht hat er es geschafft sein Problem zu lösen vielleicht auch nicht. Oder aber er hat einen ganz anderen Weg gefunden, ist ja immerhin fast ein halbes Jahr her...
Gruß
Frank | |
Re: Function ImageRotate | | | Autor: Dikn | Datum: 19.02.18 09:31 |
| Hallo!
Kann erst jetzt antworten (war unterwegs)
Ich möchte z.B. ein Architekturbild so drehen, daß senkrechte Bauteile auch wirklich senkrecht stehen (oder in Bildern den Horizont in Waage bringen). Dabei soll das Seitenverhältnis beibehalten werden.
Ich habe eine funktionierende Lösung…
vb2010
PictureBox [pb1] W/H: 592/333 – Zoom - PictureBox [pb2] W/H: 256/144 - Zoom - ScrollBar Max/Min: 10/-10
Hier meine Lösung Teil 1:
Imports System.Math
Imports System.Drawing.Drawing2D
Public Class frmEditPic
Dim bmp_In As Drawing.Bitmap: Dim bmp_Out As Bitmap: Dim out_rect As Rectangle
Dim relPb, relPic As Decimal: Dim decZoom As Decimal
Private Sub frmEditPic_Load (...) Handles Me.Load
bmp_In = New Bitmap(frmStart.strPicPathFull)
pb1.Image = bmp_In: pb2.Image = bmp_In: relPb = pb1.Width/pb1.Height
End Sub
Private Sub chb_CheckedChanged (...) Handles chbRaster.CheckedChanged, _
chbDiagonalen.CheckedChanged
pb1.Refresh
End Sub
>>>>>> Teil2
End Class funktioniert!!! Geht bestimmt einfacher/besser
Gruß Dikn | |
Re: Function ImageRotate | | | Autor: Dikn | Datum: 19.02.18 09:33 |
| Teil 2:
Private Sub HScrollBar1_ValueChanged (...) Handles HScrollBar1.ValueChanged, _
chbVollbild.Click
If sender.Text = "Vollbild" Then
If chbVollbild.Checked = True Then
chbRaster.Enabled = False: chbDiagonalen.Enabled = False
Else
chbRaster.Enabled = True: chbDiagonalen.Enabled = True
End If
End If
Dim rotW_half, rotH_half, rotL, rotT As Decimal
Dim relPicIn, RelPic2 As Decimal
Dim inW_half, inH_half As Decimal
Dim theta As Double = HScrollBar1.Value * 0.5 * PI / 180.0
If theta < 0 Then theta *= -1
Dim sin_theta As Double = Sin(theta): Dim cos_theta As Double = Cos(theta)
tb4.Text = HScrollBar1.Value * 0.5
inW_half = bmp_In.Width/2: inH_half = bmp_In.Height/2
rotW_half = inW_half*cos_theta+inH_half*sin_theta: rotH_half = _
inW_half*sin_theta+inH_half*cos_theta
rotL = rotW_half-inW_half*cos_theta+inH_half*sin_theta: rotT = rotH_half-( _
-inW_half*sin_theta+inH_half*cos_theta)
bmp_Out = New Bitmap(CInt(2*rotW_half), CInt(2*rotH_half))
Dim g As Drawing.Graphics = Graphics.FromImage(bmp_Out)
g.Clear(Color.LightGray)
Dim p_center As PointF
p_center.X = rotW_half
p_center.Y = rotH_half
Dim m As New Drawing.Drawing2D.Matrix
m.RotateAt( HScrollBar1.Value*0.5, p_center)
g.Transform = m
Dim source_rect As New Rectangle(0, 0, bmp_In.Width, bmp_In.Height)
Dim intX As Integer = CInt((bmp_Out.Width-bmp_In.Width)/2)
Dim intY As Integer = CInt((bmp_Out.Height-bmp_In.Height)/2)
Dim dest_rect As New Rectangle(intX,intY,bmp_In.Width,bmp_In.Height)
g.DrawImage(bmp_In, dest_rect, source_rect, GraphicsUnit.Pixel)
m.Dispose()
g.Dispose()
pb1.Image = bmp_Out
RelPic2 = rotT/(2*rotW_half-rotL)
relPicIn = bmp_In.Height/bmp_In.Width
If relPicIn < 1 Then
If relPicIn = pb1.Height/pb1.Width Then
out_rect.Width = Math.Floor(2*(rotH_half-rotT+rotW_half*RelPic2)/( _
relPicIn+RelPic2)/16)*16
decZoom = bmp_Out.Height/pb1.Height
Else
out_rect.Width = 2*(rotH_half-rotT+rotW_half*RelPic2)/(relPicIn+RelPic2)
decZoom = bmp_Out.Width/pb1.Width
End If
out_rect.Height = out_rect.Width*relPicIn
Else
out_rect.Height = 2*(rotW_half-rotL+rotH_half*RelPic2)/( _
bmp_In.Width/bmp_In.Height+RelPic2)
out_rect.Width = out_rect.Height/relPicIn
decZoom = bmp_Out.Height/pb1.Height
End If
out_rect.X = rotW_half-out_rect.Width/2
out_rect.y = rotH_half-out_rect.Height/2
Dim ImagePart As Bitmap = New Bitmap(out_rect.Width, out_rect.Height)
g = Graphics.FromImage(ImagePart)
Dim TargetRect As Rectangle = New Rectangle(0, 0, out_rect.Width, _
out_rect.Height)
g.DrawImage(bmp_Out, TargetRect, out_rect, GraphicsUnit.Pixel)
g.Dispose
pb2.Image = ImagePart
If chbVollbild.Checked = True Then pb1.Image = ImagePart
End Sub | |
VB.net-Code | | | Autor: VB3-Guru | Datum: 19.02.18 10:41 |
| Soweit ich sehe, ist das VB.Net Code. Der gehört eigentlich in das entsprechende Forum
Beste Grüße,
vb3-Guru | |
| 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 |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|