Forum: PC-Programmierung QPixmap drehen


von Pit (Gast)


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

von Frank (Gast)


Lesenswert?

Beispiel Bilder vorher/nachher?

von tictactoe (Gast)


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.

von Pit (Gast)


Angehängte Dateien:

Lesenswert?

Anbei mal 3 Bilder. BildOriginal ist ohne eine Drehung, die anderen zwei 
jeweils mit Drehung. Der kleine weiße Punkt istdie Koordinate zum 
Zeichnen des Bildes

von Frank (Gast)


Lesenswert?

Pit schrieb:
> Der kleine weiße Punkt istdie Koordinate zum Zeichnen des Bildes

Ist das Bild des Kreises gleich hoch/breit?

von Pit (Gast)


Lesenswert?

ja ist es

von Rolf Magnus (Gast)


Lesenswert?

Die Antwort von tictactoe klingt plausibel. Das wird 
höchstwahrscheinlich der Grund sein.

von Pit (Gast)


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.

von Mathias O. (m-obi)


Lesenswert?

Schonmal probiert mit QTransform?
Hast du mal das Originalbild zum selbertesten?

von Martin L. (martin_l795)


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.

von Rolf Magnus (Gast)


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?

von Mathias O. (m-obi)


Lesenswert?

Rolf Magnus schrieb:
> Wenn der obige Code für dich nicht als "mit QTransform" zählt, was dann?

Hoppala. Hast Recht. Als ich bei der Zeile war, hab ich mir anscheinend 
gerade den Schweiß weggewischt.
Wenn der TO mal das Originalbild oder die Funktion zum erstellen, posten 
würde, könnte man selber ein wenig rumprobieren.

von Pit (Gast)


Lesenswert?

Der Code ist doch vollständig und den kann jeder so übernehmen, bis auf 
das Laden des Bildes. Und das Originalbid ist doch auch beigefügt.

von Norbert (Gast)


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)

von Rolf M. (rmagnus)


Lesenswert?

Pit schrieb:
> Der Code ist doch vollständig

Davon ist er weit weg. Um daraus ein minimales, tatsächlich 
vollständiges und compilierfähiges Programm zu machen, brauchst du 
noch zweimal soviel Code zusätzlich.
Glaubst du ernsthaft, daß sich jemand hier die Mühe macht, den zu 
schreiben?

von tictactoe (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.