Rotateimage ungenau

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

SpionAtom

Betreff: Rotateimage ungenau

BeitragDo, März 27, 2008 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits,
mir bereitet der Rotateimage-Befehl Probleme.
Ich versuche ein quadratisches Bild 4x um 90° zu drehen. Das Ergebnis ist, dass sich Größe leicht verändert. Was kann ich da machen?

Hier ein Beispiel
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Plasma

Betreff: hmm so ?

BeitragDo, März 27, 2008 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Graphics 800,600
AutoMidHandle 1
SetBuffer BackBuffer()
original=CreateImage(20,20)
turr = CopyImage(original)
Dim tur(4)
;RotateImage turr,-45
tur(0) = turr

For i = 1 To 4
   Cls
   turr=CopyImage(original)
   RotateImage turr, 90
   tur(i) = CopyImage(turr)
   DrawImage tur(i),200,100
         DebugLog  ImageWidth(tur(i)) +"    "+ImageWidth(tur(0))
         DebugLog  ImageHeight(tur(i))+"    "+ImageHeight (tur(0))
                DebugLog "_"
   Flip
Next

SpionAtom

BeitragDo, März 27, 2008 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du drehst nur einmal. Bei dem leicht veränderten Code
Code: [AUSKLAPPEN]

Graphics 800,600
AutoMidHandle 1
original=CreateImage(80,80)
SetBuffer ImageBuffer(original)
Text 10, 10, "HALLO"


SetBuffer BackBuffer()

turr = CopyImage(original)
Dim tur(4)
;RotateImage turr,-45
tur(0) = turr
ClsColor 0, 0, 200
   Cls
For i = 1 To 4
   turr=CopyImage(original)
   RotateImage turr, 90 * i
   tur(i) = CopyImage(turr)
   DrawBlock tur(i), 200 + i * 90,100
         DebugLog  ImageWidth(tur(i)) +"    "+ImageWidth(tur(0))
         DebugLog  ImageHeight(tur(i))+"    "+ImageHeight (tur(0))
                DebugLog "_"
   Flip
Next
WaitKey
End


erhalte ich folgendes Ergebnis.
Code: [AUSKLAPPEN]
80    80
80    80
_
82    80
82    80
_
80    80
80    80
_
82    80
82    80
_


In meinem Code benutze ich kein Midhandle, also kanns daran nicht liegen... Egal, dann muss ich die Bilder halt vorher mit nem Bildbearbeitungsprogramm drehen *doof*
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, März 28, 2008 2:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Liegt mit Sicherheit daran das das Bild über den Mittelpunkt berechnet wird.
Ich habe mal eine Function geschrieben mit SpeedTest,
die Bilder dreht wegen der Geschwindigkeit bei 90,180 und 270 Grad
Code: [AUSKLAPPEN]
Graphics 800,600,0,2
TFormFilter 1
;Bild erstellen
original=CreateImage(180,80)
SetBuffer ImageBuffer(original)
Color 0,0,$0000FF : Rect 10,10,160,60,1
Color 0,0,$ffffff
Text 20, 10, "HALLO Neus Bild"
Line 0,0,80,80
;;Bild erstellen ENDE

;;Speedtest #######################
Dummy= CopyImage(Original)
time = MilliSecs()
For t= 1 To 10
RotateImage  Dummy ,180

Next
Print MilliSecs()- time + " Millisek  10x Bild Drehen mit Rotate"

time = MilliSecs()
For t= 1 To 10
RotateImageRectenWinkel(dummy,270)

Next
Print MilliSecs()- time +" Millisek  10x Bild Drehen mit Neuer Function"
Print " Hit Key "
WaitKey
;Speedtest ENDE #######################

SetBuffer BackBuffer()
ClsColor 0, 0,$008040
Cls
DrawBlock original ,100,100
Image180 = RotateImageRectenWinkel(original,180)
Image270 = RotateImageRectenWinkel(original,270)
Image90  = RotateImageRectenWinkel(original, 90)
DrawBlock  Image180 ,100,200
DrawBlock  Image270,10,100
DrawBlock  Image90 ,290,100
   Flip
WaitKey
End





Function RotateImageRectenWinkel(img%,Grad%)
    ;
    Local imgX%,imgY%,KopieIMG%,x1%,y1%
    ;
    imgX = ImageWidth (img) -1
    imgY = ImageHeight(img) -1
    LockBuffer ImageBuffer (img)
    ;
    Select Grad
        Case 90
            KopieIMG = CreateImage(ImageHeight(img),ImageWidth(img));
             LockBuffer ImageBuffer (KopieIMG)
            For y1=0 To imgY
                For x1=0 To imgX
                    CopyPixelFast x1,y1,ImageBuffer(IMG) , imgy-y1 ,x1,ImageBuffer(KopieIMG);90
                Next
            Next
            ;
        Case 180
            KopieIMG= CreateImage(ImageWidth(img),ImageHeight(img))
            LockBuffer ImageBuffer (KopieIMG)
            For y1=0 To imgY
                For x1=0 To imgX
                    CopyPixelFast x1,y1,ImageBuffer(IMG) , imgX-x1 , imgY - y1,ImageBuffer(KopieIMG);90
                Next
            Next
            ;
        Case 270
            KopieIMG= CreateImage(ImageHeight(img),ImageWidth(img));
            LockBuffer ImageBuffer (KopieIMG)
            For y1=0 To imgY
                For x1=0 To imgX
                    CopyPixelFast x1,y1,ImageBuffer(IMG) , y1 ,imgX-x1,ImageBuffer(KopieIMG);90
                Next
            Next
            ;
        Default;standart mit rotateimage
                KopieIMG= CopyImage (img)
                LockBuffer ImageBuffer (KopieIMG)
                RotateImage KopieIMG,Grad
    End Select
    ;
    UnlockBuffer ImageBuffer (img)
    UnlockBuffer ImageBuffer (KopieIMG)
    ;
    Return KopieIMG
    ;
End Function

Da bleiben die Bilder auch immer gleich groß!
[BB2D | BB3D | BB+]

SpionAtom

BeitragFr, März 28, 2008 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Joa, so hätt ichs wahrscheinlich auch gemacht, hätt ich für den BCC noch genug Bytes übrig...
Da es aber eh nur 4 Umdrehungen sind, werde ich das wohl vorher ins Bild zeichnen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, März 28, 2008 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann mach das doch mit
Code: [AUSKLAPPEN]

Resizeimage img,80,80
    ;
[BB2D | BB3D | BB+]

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group