Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi image (https://www.delphipraxis.net/141108-image.html)

LEE1 2. Okt 2009 18:39


image
 
hai

kann man irgendwie ein image perspektivisch darstellen??

alleinherrscher 2. Okt 2009 18:55

Re: image
 
Meinst du so etwas:

http://www.delphipraxis.net/internal...t.php?t=137198

In meinem ersten Posting gibt es einen Sourcecode für das Coverflow mit GR32. Da kannst du die Funktion PaintCover verwenden, um ein Bild perspektivisch zu zeichnen!

//edit: Die hier meine ich:

Delphi-Quellcode:
procedure PaintCover(DestBitmap:TBitmap32;x,y,width,height:integer;perspectiv:single;angle:integer;picture:TBitmap32);
var lo,lu,ro,ru:TPoint;
    mo,mu:extended;
    i,j:integer;
    dummy:integer;

begin


//vier Eckpunkte des Covers berechnen:

lo.x:=x;
lo.Y:=y;
lu.X:=x;
lu.Y:=y+height;
ru.x:=round(lu.x+width*cos(abs(angle)/360*2*Pi));
ru.y:=round(lu.y-perspectiv*height/2*sin(abs(angle)/360*2*Pi));
ro.X:=ru.x;
ro.Y:=round(ru.y-height+perspectiv*height*sin(abs(angle)/360*2*Pi));

if angle<0 then
begin
  dummy:=ro.y;
  ro.y:=lo.y;
  lo.y:=dummy;
  dummy:=ru.y;
  ru.y:=lu.y;
  lu.y:=dummy;
  dummy:=(width-(ro.x-lo.x));
  lo.x:=lo.x+dummy;
  lu.x:=lu.X+dummy;
  ro.x:=ro.X+dummy;
  ru.x:=ru.x+dummy;
end;

//Steigung der oberen und unteren Kante berechnen:
mo:=-(ro.Y-lo.Y)/(ro.x-lo.X);
mu:=-(ru.Y-lu.Y)/(ru.x-lu.x);

//bild zeichnen:


DestBitmap.BeginUpdate;
DestBitmap.Clear(clblack);

for i:=0 to (ro.X-lo.x) do
 for j:=round(-i*mo) to round((lu.Y-lo.y)+i*mo) do
   DestBitmap.Pixel[lo.X+i,lo.Y+j]:=round(picture.Pixels[round(picture.Width/(ro.x-lo.X)*i),round(picture.Height/((lu.Y-lo.y)+2*i*mo)*(j+i*mo))]);

//Rechteck zeichnen:
with DestBitmap do
 begin
  pencolor:=clsilver;
  moveto(lo.x,lo.y);
  linetos(lu.x,lu.y);
  linetos(ru.x,ru.y);
  linetos(ro.x,ro.y);
  linetos(lo.x,lo.y);
 end;

DestBitmap.EndUpdate;

end;

LEE1 2. Okt 2009 19:07

Re: image
 
Liste der Anhänge anzeigen (Anzahl: 1)
es kommt schon direkt en fehler


|
|
|

Die Muhkuh 2. Okt 2009 19:12

Re: image
 
Entweder Du installierst die Graphics32-Bibliothek oder Du benennest TBitmap32 in TBitmap um, dann wird das ganze aber sehr langsam. :zwinker:

alleinherrscher 2. Okt 2009 19:13

Re: image
 
@Die Muhkuh...ich die funktion linetos, die tbitmap nicht hat, da bringt das umbenennen nix...

:) Wie oben geschrieben, benötigst du - für den Code noch die Units von GR32. Das sind erweiterte Grafikkomponenten für Delphi die mehr und viel schnellere Funktionen bieten, als die Standard-Delphi Funktionen.

Lad dir das erstmal runter und installier es:

http://www.graphics32.org/wiki/

LEE1 2. Okt 2009 19:19

Re: image
 
wie geht das installieren ? sorry hab ich noch nie gemacht

alleinherrscher 2. Okt 2009 19:22

Re: image
 
Hier die Anleitung von der Seite! Viel Erfolg! http://graphics32.org/documentation/...stallation.htm :thumb:

LEE1 2. Okt 2009 19:51

Re: image
 
so habs installiert danke^^

LEE1 2. Okt 2009 19:54

Re: image
 
sorry das ich so viele fragen stelle doch jetz kommt imma noch das vonvorhin

Die Muhkuh 2. Okt 2009 19:56

Re: image
 
Zeig mal Deinen kompletten Quelltext

LEE1 2. Okt 2009 19:57

Re: image
 
ei den der mir alleinherrscher geschickt hat

Die Muhkuh 2. Okt 2009 19:58

Re: image
 
Zitat:

Zitat von Die Muhkuh
Zeig mal Deinen kompletten Quelltext


DeddyH 2. Okt 2009 19:59

Re: image
 
Die entsprechenden Units der GR32 sind aber eingebunden?

Die Muhkuh 2. Okt 2009 20:00

Re: image
 
Zitat:

Zitat von DeddyH
Die entsprechenden Units der GR32 sind aber eingebunden?

Das wird das Problem sein :zwinker:

DeddyH 2. Okt 2009 20:02

Re: image
 
Vermutlich :mrgreen:

LEE1 2. Okt 2009 20:03

Re: image
 
oh sorry vergessen wieder hin zu schreiben mein delphi war hängen geblieben un hab dann nid wieder eingefügt

doch wie benutz ich die procedure?

DeddyH 2. Okt 2009 20:06

Re: image
 
Lad Dir doch das Beispielprojekt aus dem verlinkten Thread herunter und schau Dir den Source an.

LEE1 2. Okt 2009 20:08

Re: image
 
ja mein pc is hängen beblieben un dann war das projekt weg hab dann aber vergessen sie wieder einzufügen :-)


doch wie benutz ich die procedure





sorry das ich doppelt geschrieben hab hab gedacht der eintrag wäre nich angekommen

DeddyH 2. Okt 2009 20:09

Re: image
 
Zitat:

Zitat von DeddyH
Lad Dir doch das Beispielprojekt aus dem verlinkten Thread herunter und schau Dir den Source an.

Meinst Du nicht, dass das evtl. da drin stehen könnte?

LEE1 2. Okt 2009 20:14

Re: image
 
Liste der Anhänge anzeigen (Anzahl: 1)
beim öffnen kommt schon dies hier



.

Die Muhkuh 2. Okt 2009 20:18

Re: image
 
Einfach auf alle Ignorieren drücken.

LEE1 2. Okt 2009 20:31

Re: image
 
danke^^

Luckie 2. Okt 2009 20:35

Re: image
 
Und bitte gib deinem Thread das nächste mal einen aussagekräftigen Titel.

alleinherrscher 2. Okt 2009 20:37

Re: image
 
Man benutzt die Procedure ganz einfach:

1) Da du jetzt ja die GR32 installiert hast, kannst du ein TImage32 anstelle eines TImage auf dein Formular ziehen. (Das hat jetzt sagen wir mal den namen Image321)

2) Erstelle eine Prozedur, die ein TBitmap32 einliest aus irgendwelchen Dateien von dir, also z.B.

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender:TObject);
var aBmp32:TBitmap32;
begin

aBmp32:=TBitmap32.create; //erstmal das Objekt erstellen
aBmp32.loadfromfile('dateiname.bmp');
3) Rufe jetzt die PaintCover Procedur auf:

Delphi-Quellcode:

procedure PaintCover(DestBitmap:TBitmap32;x,y,width,height:integer;perspectiv:single;angle:integer;picture:TBitmap32);
DestBitmap ist das Bitmap, wo die Procedur das perspektivische Bild hinzeichnen soll. x,y,width und height sind die Positionsangaben in DestBitmap für das perspektivische Bild.

Perspectiv ist ein Wert zwischen 0 und 1, der festlegt wie stark perspektivisch das Bild dargestellt werden soll (also die Tiefenwirkung)

angle ist der Winkel zwischen 0 und 90 grad.

d.h. in unserem Beispiel könntest du die PaintCover funktion so aufrufen:

Delphi-Quellcode:
PaintCover(Image321.Bitmap,0,0,50,50,0.5,30,aBmp32);
Und dann sollte eigentlich schon was zu sehen sein....

LEE1 2. Okt 2009 20:45

Re: image
 
Liste der Anhänge anzeigen (Anzahl: 1)
jetz kommt das

alleinherrscher 2. Okt 2009 20:46

Re: image
 
Jetzt kommt das "Debuggen" :) kann sein, dass Gr32 da auf n Error läuft, weil du auf Pixel zugreifen willst, die außerhalb deines Images liegen (also wenn das beispielsweise nur 30x30 Pixel groß ist, und wir aber eine Width und Height von 50 in PaintCover angegeben haben)

alleinherrscher 2. Okt 2009 20:47

Re: image
 
---oh man bin ich ein schussel heute abend --- *verurteilt im Sinne der Anklage wegen einem überflüssigen post*

LEE1 2. Okt 2009 21:11

Re: image
 
ja das is logisch doch mein image is größer als 50 un es kommt trotzdem

Namenloser 2. Okt 2009 21:51

Re: image
 
Wollte nur mal kurz darauf hinweisen, dass die GR32 schon sehr leistungsfähige Transformations-Funktionen eingebaut haben. Von Skalierung über Drehung bis zu freier Verformung ist eigentlich alles damit möglich. Es gibt dazu auch eine Demo.

alleinherrscher 3. Okt 2009 10:18

Re: image
 
@LEE1: Ohne SourceCode Einblicke wird das etwas schwierig mit dem Helfen, glaub ich...

LEE1 3. Okt 2009 11:14

Re: image
 
ok hier ist der code
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,GR32, GR32_Image;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image321: TImage32;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
   procedure PaintCover(DestBitmap:TBitmap32;x,y,width,height:integer;perspectiv:single;angle:integer;picture:TBitmap32);
var lo,lu,ro,ru:TPoint;
    mo,mu:extended;
    i,j:integer;
    dummy:integer;

begin


//vier Eckpunkte des Covers berechnen:

lo.x:=x;
lo.Y:=y;
lu.X:=x;
lu.Y:=y+height;
ru.x:=round(lu.x+width*cos(abs(angle)/360*2*Pi));
ru.y:=round(lu.y-perspectiv*height/2*sin(abs(angle)/360*2*Pi));
ro.X:=ru.x;
ro.Y:=round(ru.y-height+perspectiv*height*sin(abs(angle)/360*2*Pi));

if angle<0 then
begin
  dummy:=ro.y;
  ro.y:=lo.y;
  lo.y:=dummy;
  dummy:=ru.y;
  ru.y:=lu.y;
  lu.y:=dummy;
  dummy:=(width-(ro.x-lo.x));
  lo.x:=lo.x+dummy;
  lu.x:=lu.X+dummy;
  ro.x:=ro.X+dummy;
  ru.x:=ru.x+dummy;
end;

//Steigung der oberen und unteren Kante berechnen:
mo:=-(ro.Y-lo.Y)/(ro.x-lo.X);
mu:=-(ru.Y-lu.Y)/(ru.x-lu.x);

//bild zeichnen:


DestBitmap.BeginUpdate;
DestBitmap.Clear(clblack);

for i:=0 to (ro.X-lo.x) do
for j:=round(-i*mo) to round((lu.Y-lo.y)+i*mo) do
   DestBitmap.Pixel[lo.X+i,lo.Y+j]:=round(picture.Pixels[round(picture.Width/(ro.x-lo.X)*i),round(picture.Height/((lu.Y-lo.y)+2*i*mo)*(j+i*mo))]);

//Rechteck zeichnen:
with DestBitmap do
begin
  pencolor:=clsilver;
  moveto(lo.x,lo.y);
  linetos(lu.x,lu.y);
  linetos(ru.x,ru.y);
  linetos(ro.x,ro.y);
  linetos(lo.x,lo.y);
end;

DestBitmap.EndUpdate;

end;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var aBmp32:TBitmap32;
begin

aBmp32:=TBitmap32.create; //erstmal das Objekt erstellen
aBmp32.loadfromfile('cover.bmp');
PaintCover(Image321.Bitmap,0,0,50,50,0.5,30,aBmp32)

end;

end.

alleinherrscher 3. Okt 2009 11:27

Re: image
 
Sry, hab noch vergessen, das Bitmap in Image321 zu erstellen.

Ersetz den Code von Button1Click mal bitte durch diesen hier:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var aBmp32:TBitmap32;
begin

aBmp32:=TBitmap32.create; //erstmal das Objekt erstellen
aBmp32.loadfromfile('c:\Test.bmp');
Image321.Bitmap:=tbitmap32.create;
Image321.Bitmap.Width:=image321.clientWidth;
Image321.bitmap.height:=image321.clientheight;
PaintCover(Image321.Bitmap,1,1,150,150,0.5,30,aBmp32)

end;

LEE1 3. Okt 2009 11:35

Re: image
 
Liste der Anhänge anzeigen (Anzahl: 1)
juhu es klappt doch beim zweiten start passierte dies hier

(problem hab ich sau oft)

hugo1990 3. Okt 2009 11:44

Re: image
 
Dann wird das Programm noch im Hintergrund laufen und du möchtest neu kompilieren, da das Programm aber noch läuft, kann die exe-Datei nicht überschrieben werden.

LEE1 3. Okt 2009 11:45

Re: image
 
es läuft aber nidd mehr

DeddyH 3. Okt 2009 11:45

Re: image
 
Da kommt aber doch normalerweise "Quellcode wurde geändert. Neu kompilieren?" oder so ähnlich :gruebel:

[edit] @LEE1: Hast Du es mal mit "Projekt erzeugen" versucht? [/edit]

LEE1 3. Okt 2009 11:47

Re: image
 
ja geht aber auch nidd hab delphi mal geschlossen un 3 min gewartet geht ava immer noch nidd

alleinherrscher 3. Okt 2009 11:48

Re: image
 
Zitat:

Zitat von DeddyH
Da kommt aber doch normalerweise "Quellcode wurde geändert. Neu kompilieren?" oder so ähnlich :gruebel:

[edit] @LEE1: Hast Du es mal mit "Projekt erzeugen" versucht? [/edit]


Also bei mir zeigt er den Fehler an, wenn ich z.B. das Verzeichnis, in welchem das Programm kompiliert habe, im Netzwerk freigegeben habe und die exe auf einem Netzwerkrechner noch läuft. Dann hat Delphi quasi keine Schreib bzw. Löschrechte für die alte echse...

haentschman 3. Okt 2009 11:48

Re: image
 
...nicht immer. Nur wenn das Programm am Breakpoint angehalten wurde und der Quellcode verändert ist kommt diese Meldung.

Beim normalen "Neucompilieren" weigert sich Delphi die laufende Exe zu überschreiben (logisch) :zwinker:

upps...
Bezug auf "Quellcode wurde geändert. Neu kompilieren?"

DeddyH 3. Okt 2009 11:49

Re: image
 
Schreibrechte hast Du in den entsprechenden Verzeichnissen (Ausgabe- und Source-Verzeichnis)? Geht es als Admin?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.
Seite 1 von 2  1 2      

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