Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild um einen Bestimmten Winkel drehen (https://www.delphipraxis.net/52019-bild-um-einen-bestimmten-winkel-drehen.html)

nano 22. Aug 2005 19:43


Bild um einen Bestimmten Winkel drehen
 
Erstmal ein herzliches Hallo in diesem Forum, bin ein Neuling =)

Stehe seit Tagen vor einem entscheidendem Problem: Wie kann ich ein Bild (Bitmap) um einen Bestimmten Winkel drehen?

Ist es überhaupt möglich, dies zu schaffen ohne einzelne Pixelwerte abzufragen?

Bin für jeden Hinweis sehr dankbar!


ps: Es geht hierbei um ein Projekt für die erstellung symmetrischer Ornamente. Dazu brauche ich unbedingt Die Achsen und Punktspiegelungs, sowie die Drehung...

MrSpock 22. Aug 2005 19:57

Re: Bild um einen Bestimmten Winkel drehen
 
Hallo nano,

zunächst einmal herzlich willkommen im Delphi PRAXIS Forum.

Ich hatte vor einiger Zeit auch das Problem und habe es mit der TRotateImage Komponete, die du hier findest gelöst. Ist eine gute Komponente und Freeware.

Delphi-Freak 22. Aug 2005 20:06

Re: Bild um einen Bestimmten Winkel drehen
 
Ebenfalls HERZLICH WILLKOMMEN :party:

Oder falls du mehr machen willst (nicht nur drehen, auch z.B. Transparenz ...) verwende doch Graphics32

Edit: War von mir etwas kurz ausgedrückt :oops:
etwas genauer: Graphics 32 bietet eigene Komponenten als Ersatz für z.B. TImage. Damit kann man z.B. ein Bild über ein anderes legen, jedoch mit teilweise Transparenz (worauf ich mich zuerst beziehen wollte). Es werden auch Möglichkeiten geboten, um Bilder mit Filtern zu vergrößern bzw. zu verkleinern, wodurch man dann beim Vergrößern nicht die einzelnen Pixel erkennen kann. Diese Kompos bieten dann aber noch einige Funktionen mehr... wenn du willst oder Interesse hast, kannst du sie ja einmal ausprobieren.


LG, Delphi-Freak

Khabarakh 22. Aug 2005 20:10

Re: Bild um einen Bestimmten Winkel drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vorneweg: Ohne einzelne Pixelmanipulation geht gar nichts.
Dann kommt es darauf an, um welche Winkel du drehen willst. Sollen es nur Vielfache von 90° sein, findest du sicher im Internet Prozeduren fürn ein normales TBitmap.
Sollen es auch andere Winkel sein, wird das Ganze schon schwieriger. Es ist sicher immer noch mit den Standardkomponenten von Delphi zu schaffen, allerdings wird das Bitmap danach nicht sehr schön aussehen, wenn du einfach jedem Pixel die Farbe des entsprechenden Pixels zuweist. Der nächster Schritt wäre, die Pixel auch mit Float-Koordinaten anzusprechen, damit ein Pixel, das nach der Drehung "zwischen den echten Pixeln landet", auf alle umgebenden im richtigen Verhältnis "abfärbt". Spätestens hier würde ich allerdings zur GR32-Lib greifen, die dies, große Performanceschübe, Alphatransparenz und vieles mehr bietet.
Ich hänge mal eine Demo-Echse der Library an (PixelFS = Floatkoordinaten).

[add]Ich bin zu langsam :mrgreen: . Aber das kann man trotzdem stehen lassen, denke ich. [/add]

Delphi-Freak 22. Aug 2005 20:15

Re: Bild um einen Bestimmten Winkel drehen
 
Dafür hast du's trotz meines Edits besser ausgedrückt und außerdem einen besseren Link :wink:

nano 23. Aug 2005 21:44

Re: Bild um einen Bestimmten Winkel drehen
 
vielen Dank für eure Tipps.. Hab heute graphics32 installiert, aber noch nicht getestet... Gibts da vielleicht noch deutsch onlinehilfe dazu?

danke!

Khabarakh 23. Aug 2005 21:58

Re: Bild um einen Bestimmten Winkel drehen
 
Nö :wink: .
Englisch gehört einfach zum Programmieren dazu, da geht (oft) kein Weg vorbei.

SirThornberry 23. Aug 2005 22:47

Re: Bild um einen Bestimmten Winkel drehen
 
dafür gibt es die Funktion PlgBlt

nano 24. Aug 2005 13:22

Re: Bild um einen Bestimmten Winkel drehen
 
versuche jetzt in meinem Proggie alle TImage Komponente durch TImage32 zu ersetzen.. Gleich ein Paar Fragen:

1. Wenn das Fenster minimiert oder durch ein anderes überdeckt wird, erlischt das Bild an dieser Stelle.. Wie kann man das vermeiden?

2. Wohin soll man am besten Zeichnen? Aufs Canvas oder Bitmap direkt?

3. Image32.Bitmap.LineTo verlangt nun nach einem neuen Parameter vom typ HDC, was ist das überhaupt? (OnlineHilfe hat mich nicht schlauer gemacht :-/)

danke!

Bitmap 26. Aug 2005 17:57

Re: Bild um einen Bestimmten Winkel drehen
 
Zitat:

1. Wenn das Fenster minimiert oder durch ein anderes überdeckt wird, erlischt das Bild an dieser Stelle.. Wie kann man das vermeiden?
Um das zu verhindern, sollten sämtliche Zeichenoperationen zum Event OnPaint (z.B. von TForm oder TPaintBox) erfolgen. Dieses wird bei einer Überdeckung, etc. aufgerufen. Windows kümmert sich darum, dass nur der überdeckte Bereich neu gezeichnet wird, so dass nicht das ganze Bild neu aufgebaut werden muss.

Zitat:

2. Wohin soll man am besten Zeichnen? Aufs Canvas oder Bitmap direkt?
Das kommt darauf an, was Du zeichnen möchtest. Ich verwende meistens ein TPaintBox Objekt um darin zu zeichnen.
Soweit ich das Verstehe, kannst Du immer nur auf Canvas zeichnen. Du kannst aber zwischen TForm.canvas und TBitmap.canvas auswählen. Bei TBitmap32 ist Canvas allerdings für den User transparent, d.h. Du kannst direkt MyBitmap.LineTo(X,Y) aufrufen.

Zitat:

3. Image32.Bitmap.LineTo verlangt nun nach einem neuen Parameter vom typ HDC, was ist das überhaupt? (OnlineHilfe hat mich nicht schlauer gemacht :-/)
Alle Möglichkeiten von LineTo haben bei mir immer nur die Parameter (X,Y:integer). HDC ist normalerweise ein Windows Handle wie es beim initieren von TBitmap erzeugt und zurückgegeben wird. Kann es sein, dass bei Dir dieser Schritt irgenwie nicht berücksichtig wurde?

Hoffe das hilft mal etwas weiter ... :wink:

jfheins 26. Aug 2005 18:24

Re: Bild um einen Bestimmten Winkel drehen
 
Du solltest entweder aufs Bitmap zeichnen, oder ein Bitmap im Speicher haben, und darauf Zeichnen, und in OnPaint oder so dieses dann auf die PaintBox z.B. zeichnen ;)

Khabarakh 26. Aug 2005 18:29

Re: Bild um einen Bestimmten Winkel drehen
 
Zitat:

2. Wohin soll man am besten Zeichnen? Aufs Canvas oder Bitmap direkt?
Das Standardverfahren ist eigentlich die OffScreenBitmap-Methode, d.h. ein Bitmap wird im Speicher gehalten und im OnPaint auf die Paintbox kopiert. Mit der GR32-Lib wird aus diesem Soll ein Muss, da nur TBitmap32 die erweiterten Funktionen eben jener bietet. Man kann auch direkt auf den Buffer von TPaintbox32 zeichnen und diesen dann mit TPaintbox32.Flush anzeigen lassen.
Zitat:

3. Image32.Bitmap.LineTo verlangt nun nach einem neuen Parameter vom typ HDC, was ist das überhaupt? (OnlineHilfe hat mich nicht schlauer gemacht :-/)
Irgendetwas machst du falsch :gruebel: :
GR32 Help
TBitmap32.LineTo
procedure LineToS(X, Y: Integer);

procedure LineToTS(X, Y: Integer);

procedure LineToAS(X, Y: Integer);

procedure LineToXS(X, Y: TFixed);

procedure LineToFS(X, Y: Single);

procedure LineToXSP(X, Y: TFixed);

procedure LineToFSP(X, Y: Single);


Bitmap 27. Aug 2005 07:33

Re: Bild um einen Bestimmten Winkel drehen
 
Hallo

Ich wollte die Komponenten von Graphic32 für die Entwicklungsumgebung registrieren. Leider schaffe ich das im Moment nicht. :wall:
Habe gemäss Hilfe das Bibliotheksverzeichnis gesetzt und bin auf Komponente->Komponente installieren um entsprechendes Paket reinzuholen. Trotzdem werden mir die Icons in der Entwicklungsumgebung nicht angezeigt.
Bin dankbar um jeden Tipp ...

Khabarakh 27. Aug 2005 08:12

Re: Bild um einen Bestimmten Winkel drehen
 
Hast du auch das Design-Package ausgewählt, also z.B. GR32_DSGN_D7.dpk?

Bitmap 27. Aug 2005 09:10

Re: Bild um einen Bestimmten Winkel drehen
 
Danke, hatte nur das Paket GR32_D7.dpk installiert. Nun klappt es! :dancer:

MarcoWarm 27. Aug 2005 09:52

Re: Bild um einen Bestimmten Winkel drehen
 
am besten und ganz ohne extra Komponente geht's mit GDI+. Das ganze ist recht schlank und schnell:

http://www.delphi-forum.de/topic_GDI...455e9f5f4b26cc

Khabarakh 27. Aug 2005 10:42

Re: Bild um einen Bestimmten Winkel drehen
 
Ich habe im Artikel nichts gefunden, kann GDI+
  • Mit Fließkommakoordinaten umgehen (+Anti-Aliasing)?
  • Bitmaps unter Berücksichtigung der Alphakanäle zusamenfügen?
  • Mit Layern umgehen (wichtig: Repaint-Optimisierungen)?
  • PNGs mit Alphakanal abspeichern?
Das wären für mich wichtige Punkte, die ich oft benutze.
Und ich behaupte einfach mal, dass die GR32-Lib schneller als GDI ist :wink: .

[add]Ups, langsam wirds etwas OT [/add]

xaromz 27. Aug 2005 11:20

Re: Bild um einen Bestimmten Winkel drehen
 
Hallo,

Zitat:

Zitat von Khabarakh
Ich habe im Artikel nichts gefunden, kann GDI+
  • Mit Fließkommakoordinaten umgehen (+Anti-Aliasing)?

GDI+ kann (eigentlich) nur Fließkomma.
Zitat:

Zitat von Khabarakh
  • Bitmaps unter Berücksichtigung der Alphakanäle zusamenfügen?

GDI+ hat immer einen Alphakanal. Also ja.
Zitat:

Zitat von Khabarakh

Sowas kann GDI+ nicht, lässt sich aber schnell selbst basteln (mehrere Graphikobjekte nehmen und übereinander zeichnen). Optimierungen gibt's da leider keine, aber das kann man sich ja auch selbst basteln, wenn's unbedingt nötig ist.
Ich hab auf Basis von GDI+ eine SVG-Komponente gebastelt. Die zeichnet jeden Layer einzeln über die vorherigen. Ab einer gewissen Größe wird das natürlich etwas langsamer, aber für den Hausgebrauch reicht's.
Zitat:

Zitat von Khabarakh
  • PNGs mit Alphakanal abspeichern?

Laden und anzeigen funktioniert, speichern sollte auch gehen (hab ich nicht ausprobiert).
Zitat:

Zitat von Khabarakh
Das wären für mich wichtige Punkte, die ich oft benutze.
Und ich behaupte einfach mal, dass die GR32-Lib schneller als GDI ist :wink: .

Wir sprechen hier von GDI+. Ist zwar nicht hardwarebeschleunigt (wollte MS mal machen, aber jetzt kommt ja Avalon).
Ich denke schon, dass MS hier hochoptimierte Routinen geschrieben hat, schliesslich läuft das ganze moderne XP-Zeug drauf (Transparenz, Schriftenglättung...).

Gruß
xaromz

Khabarakh 27. Aug 2005 12:33

Re: Bild um einen Bestimmten Winkel drehen
 
Super :thumb: ! Bisher habe ich auf eine Umsetzung der GR32-Lib für .Net gewartet, bevor ich mich richtig mit C# beschäftige, aber jetzt muss ich mir wohl GDI mal genauer anschauen :wink: .

Zum Thema Geschwindigkeit: Ich bleibe bei meiner Behauptung :P . GR32 besteht aus sehr viel Assmebler, benutzt SSE und MMX, die Pixel können direkt über Pointer angesprochen werden, ... Das kann eigentlich nur noch mit Hardwarebeschleunigung schneller gehen.

nano 28. Aug 2005 11:52

Re: Bild um einen Bestimmten Winkel drehen
 
Hallo Leute =)

Erstmal danke für die aktive Beantwortung meiner Fragen... Hab jetzt endgültig GR32 Komponente in mein Programm eingebaut und werde aus diesem Grund auch nicht auf PaintBox oder andere Komponente umsteigen. Jetzt zeichne ich direckt aufs Bitmap von Image32 bzw. einem Layer.. Und da kommt gleich das nächste Problem.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Img do
  begin
    Layers.Clear;
    Scale := 1;
    Bitmap.SetSize(150, 150);
    Bitmap.Clear(clGreen32);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var BL: TBitmapLayer;
begin
BL := TBitmapLayer(Img.Layers.Add(TBitmapLayer));


with BL.Bitmap do
begin
    bl.Bitmap.SetSize(150,150);
    bl.Bitmap.DrawMode := dmBlend;

    PenColor:= clRed32;
    MoveTo(3,3);
    LineToS(150,150);

    Bl.Scaled:= true;

end;

end;
Wie ihr sehen könnt, erstellt die erste Prozedur ein Bitmap auf der Komponente.
Die zweite Prozedur ist dafür zuständig, dass ein Layer erstellt und gezeichnet wird.

Eigentlich ist die Größe des Image32.Bitmaps und des Layers gleich, trotzdem wird das Bitmap vom Layer kleiner gezeichnet, und zwar so:
http://inflicted.de/tmp/delphi.gif



obwohl die Linie bis ganz unten rechts gehen sollte...

Was mache ich falsch?

Gandalfus 28. Aug 2005 12:21

Re: Bild um einen Bestimmten Winkel drehen
 
wenn man nur ein Bild drehen will kann man auf externe Sachen wie Graphic32 verzichten.

Infos und Copy&Paste Lösung:
http://www.efg2.com/Lab/ImageProcess...teScanline.htm

Khabarakh 28. Aug 2005 13:03

Re: Bild um einen Bestimmten Winkel drehen
 
@nano:
Delphi-Quellcode:
Bl.Location := FloatRect(0, 0, 150, 150);
@Gandalfus: Hast du dir die Exe überhaupt angeschaut? Du musst doch zugeben, dass das Ergebnis ohne AntiAliasing o.Ä. ziemlich ... bescheiden aussieht.

nano 28. Aug 2005 13:35

Re: Bild um einen Bestimmten Winkel drehen
 
Yeepie :D

Danke! =)

Aber was ist das denn für ein Knick??

http://inflicted.de/tmp/delphi2.gif

Stanlay Hanks 28. Aug 2005 13:43

Re: Bild um einen Bestimmten Winkel drehen
 
Wo denn?

PierreB 28. Aug 2005 14:19

Re: Bild um einen Bestimmten Winkel drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Stanlay Hanks
Wo denn?

Hier: (genau in der Mitte der Linie)

Delphi-Freak 28. Aug 2005 15:10

Re: Bild um einen Bestimmten Winkel drehen
 
Irgendwie scheint mir, dass die Linie nicht mit AntiAliasing gezeichnet wird... außerdem geht sie nicht auf das Pixel ganz im Eck, sondern auf das Pixel darüber...

Stanlay Hanks 28. Aug 2005 15:13

Re: Bild um einen Bestimmten Winkel drehen
 
Naja, das dürfte eine "normale" Ungenauigkeit sein. Ich denke mal, da hier mit Pixeln gerechnet wird und es nunmal keine Halben/dreiviertelten etc Pixel gibt, kann sowas schonmal vorkommen.

Man liest sich, Stanlay :hi:

Delphi-Freak 28. Aug 2005 16:59

Re: Bild um einen Bestimmten Winkel drehen
 
Aja, an die Kommas habe ich nicht gedacht, ich habe bis jetzt immer nur mit ganzen Pixeln gearbeitet...

Bitmap 29. Aug 2005 11:42

Re: Bild um einen Bestimmten Winkel drehen
 
Khabarakh hat folgendes geschrieben:
Zitat:


Mit Layern umgehen (wichtig: Repaint-Optimisierungen)?

Die neueste Version von Graphics32 (1.8 Beta) kann mit folgendem Link heruntergeladen werden:

Graphics32 V1.8beta

nano 29. Aug 2005 12:42

Re: Bild um einen Bestimmten Winkel drehen
 
Die Linie wurde ohne AntiAliasing gezeichnet =)

Sogar die stinknormale TImage Komponente zeichnet eine Linie von 0,0 zu 150,150 gerade. Da können bei der Berechnung nun wirklich nicht Knicke entstehen =)

Khabarakh 29. Aug 2005 13:30

Re: Bild um einen Bestimmten Winkel drehen
 
www.graphics32.org
What's new in version 1.8?

[...]

Bugfixes:
  • Fix for jagged lines problem in LineS, LineTS and LineAS.

Nutzt du noch 1.7? Mit Line geht es aber auf jeden Fall.

nano 30. Aug 2005 11:38

Re: Bild um einen Bestimmten Winkel drehen
 
kann ich das einfach so updaten, ohne Komponente auf der Form zu ersetzen?

Khabarakh 30. Aug 2005 12:12

Re: Bild um einen Bestimmten Winkel drehen
 
Sollte schon gehen, einfach nochmal das Package installieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz