QPixmap drehen

Gast #4177226
Lesenswert?

Hallo zusammen,

von der Sache her ist mein Problem trivial. Ich möchte unter Qt ( Qt 
Creator 3.1.0 ) ein QPixmap drehen. Folgende Code verwende ich dazu:
1
QPixmap bild;
2

3
QTransform trans;
4

5
static quint16 u16_Counter = 0;
6
static quint16 u16_Degree = 0;
7

8
// bild laden
9
bild = *q_GetQPIxmap(picture);
10

11
QPixmap copy(bild.size());
12

13
// Drehpunkt in die Mitte des Bildes legen
14
trans.translate( copy.size().width() / 2, copy.size().height() / 2 );
15

16
// Verzögerung für das Drehen
17
if( u16_Counter == 20 )
18
{
19
   u16_Counter = 0;
20

21
   if( u16_Degree == 360 )
22
   {
23
      u16_Degree = 0;
24
   }
25
   else
26
   {
27
      u16_Degree += 10;
28
   }
29

30
}
31
else
32
{
33
   u16_Counter++;
34
}
35

36
// bild drehen
37
trans.rotate(u16_Degree);
38

39
//koordinaten zurück auf 0,0
40
trans.translate( -copy.size().width() / 2, -copy.size().height() / 2 );
41

42
//transformieren und zeichnen
43
copy = bild.transformed(trans);
44

45
p->drawPixmap( 150, 150, copy );

Mein QPixmap dreht sich auch, aber nich so wie ich möchte. Ich möchte, 
dass es sich um den eigenen Mittelpunkt dreht. Tuts halt nicht.
Den Code habe ich mir mehr doder weniger aus einem Beispiel von Qt 
geholt. Kann dazu einer was sagen?

Gruß Pit
Gast #4177242
Lesenswert?

Pit schrieb:
> Mein QPixmap dreht sich auch, aber nich so wie ich möchte. Ich möchte,
> dass es sich um den eigenen Mittelpunkt dreht. Tuts halt nicht.

So, so. Und was tut's dann?

> Den Code habe ich mir mehr doder weniger aus einem Beispiel von Qt
> geholt. Kann dazu einer was sagen?

Vielleicht der Autor von dem Beispiel?

Die Dokumentation von QPixmap::translate() hast du aber schon gelesen? 
Oder? Es würde mich nicht wundern, wenn die Drehung vollkommen richtig 
gemacht wird, aber weil dann das Ergebnis von translate() i.A. größer 
sein muss als die Original-Pixmap ("...the smallest pixmap that contains 
all the transformed points of the original pixmap..."), wird beim 
Zuweisen auf deine QPixmap mit vorgegebener Größe der linke obere Teil 
des Ergebnisses herausgeschnitten.
Gast #4185256
Lesenswert?

So hab jetzt mal wieder etws Zeit, um mich um das Drehen zu kümmern.

Rolf Magnus schrieb:
> Die Antwort von tictactoe klingt plausibel. Das wird
> höchstwahrscheinlich der Grund sein.

Ich denke, dass dies nicht das Problem ist. Schließlich wird das Bild 
vollständig gezeichnet, es wird nur einfach nicht um den Bildmittelpunkt 
gedreht.

Das Pixel verloren gehen hatte ich mal bei einer vorherigen 
Implementation gesehen. Von daher bin ich mal froh, dass ich nun das 
Bild vollständig zeichnen und drehen kann, halt nur nicht um den 
gewünschten Punkt.
#4186625
Lesenswert?

Habe nur mal kurz gegoogled. Paßt vielleicht das hier?:

The usual reason an object rotates around its top left point, rather 
than its centre, is because it has its dimensions defined with 0,0 at 
the top left, rather than being in the centre of the object.

You haven't shown what the 'canvas' object is, so assuming it's 
something like a QGraphicsRectItem, you'd need to declare its top left, 
width, height as -x/2, -y/2, width, height to ensure that the centre 
point of the object is at 0,0. Then when you rotate the object, it will 
rotate about its centre.
Gast #4186695
Lesenswert?

Pit schrieb:
> Das Pixel verloren gehen hatte ich mal bei einer vorherigen
> Implementation gesehen. Von daher bin ich mal froh, dass ich nun das
> Bild vollständig zeichnen und drehen kann, halt nur nicht um den
> gewünschten Punkt.

Ok, ich dachte, das Problem sei, daß das Bild beim drehen kleiner wird, 
um alles unterzubringen.

Was mir noch nicht ganz klar ist: Warum hat bei deinen Beispielbildern 
das um 40° gedrehte Bild eine ganz andere Auflösung und ein anderes 
Seitenverhältnis wie die beiden anderen?


Mathias O. schrieb:
> Schonmal probiert mit QTransform?

Wenn der obige Code für dich nicht als "mit QTransform" zählt, was dann?
Gast #4190155
Lesenswert?

Thread erstellt am: 25.06.2015 um: 08:17
Frage korrekt beantwortet am: 25.06.2015 um: 08:37 (20 min später)

Jetzt haben wir: 07.07.2015 07:31 und das Thema ist immer noch nicht 
durch?

Gegeben: Bild 100x100 Pixel mit Kreis, Mittelpunkt: 50,50

Nun Rotation: 45°
Bild: 141x141 Pixel, Mittelpunkt 71,71

Entweder das neue Bild um jeweils 20 Pixel an allen vier Rändern 
'croppen', da im erweiterten Bereich keine sinnvollen Daten sind.

Oder aber die neue drawPixmap x,y Koordinate um -20,-20 anpassen.

Fettich!

(Alle Pixelangaben brutal gerundet)
Gast #4194643
Lesenswert?

Pit schrieb:
> Rolf Magnus schrieb:
>> Die Antwort von tictactoe klingt plausibel. Das wird
>> höchstwahrscheinlich der Grund sein.
>
> Ich denke, dass dies nicht das Problem ist. Schließlich wird das Bild
> vollständig gezeichnet, es wird nur einfach nicht um den Bildmittelpunkt
> gedreht.

Deine Beispielbilder sehen aber doch ganz genau so aus, also ob dies das 
Problem ist. Probier's mal mit einem Bild, das nicht einen einheitlich 
schwarzen Hintergrund hat, einem Foto-Ausschnitt zum Beispiel.

Es wird ja nicht nur der lila Dreiviertelkreis gedreht, sondern jedes 
Pixel. Wenn ein Eck-Pixel um 40 Grad gedreht wird, wandert es aber aus 
dem Bild hinaus. Und wie in der Doku steht, wird das Bild dann 
vergrößert. Wenn du von dem Ergebnis eine fixe Größe links oben 
rausschneidest, sieht das ganze natürlich aus, als ob nicht um das 
Zentrum gedreht worden wäre.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren