Autor Beitrag
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mo 01.03.04 01:46 
Hi,

TTransImage ist eine Klasse, abgeleitet von TImage, welche den Übergang zwischen Bildern darstellt.
Zur Klasse gehören ein Demoprogramm inklusive Dokumentation.

Ein paar Feedbacks wären cool:

Downloadlink
www.angelfire.com/ul...asel/TTransImage.zip

Auszüge derDokumentation
Mit der Klasse TTransImage, abgeleitet von TImage, können Bilder nahtlos ineinander überblendet werden.

Es ist sowohl möglich zwischen 2 Bildern zu wechseln, als auch eine Slide-
Show mit Hilfe einer Bilderliste anzuzeigen.

Im "Zwei-Bild-Modus" kann zwischen zwei Methodologien gewählt werden:

a1>Direkte Transformation

b1>Berechnung der Transformation
b2>Ausführung der Transformation

Das Berechnen einer Transformation nimmt, je nach Bildgrösse eine gewisse Zeit in Anspruch. Daher kann es für den Anwender von Vorteil sein eine Transformation zu einem geeigneten Zeitpunkt vorzubereiten um diese später, bei Bedarf, schneller starten zu können. Variante a> entspricht dabei vollständig b1> + b2>.

Hier der Sourcecode:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
unit UTransImage;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type

  TTransPixel = record
    x : integer;
    y : integer;
    start_r : integer;
    start_g : integer;
    start_b : integer;
    speed_r : real;
    speed_g : real;
    speed_b : real;
    mod_r : integer;
    mod_g : integer;
    mod_b : integer;
    ziel_r : integer;
    ziel_g : integer;
    ziel_b : integer;
    deltamax : integer;
    richtung_r : boolean;
    richtung_g : boolean;
    richtung_b : boolean;
  end;

  TSlide = record
    bild : string;
    delay : integer;
end;

  TTransImage = class(TImage)
    private
      bilderliste : array of TSlide;
      pixelmap : array of TTransPixel;
      startmap : TBitmap;
      frame : TBitmap;
      zielmap : TBitmap;
      totalsteps : integer;
      clock : integer;
      ratio : integer;
      procedure modpixel(mappos:integer);
      procedure setpixelmap;
      procedure calcspeed;
      procedure render;
    public
    constructor create(Owner:TComponent);reintroduce;
    procedure setstartmap(bildname:string);
    procedure setzielmap(bildname:string);
    procedure setratio(ratioval:integer);
    procedure direkttransform;
    procedure vorbereiten;
    procedure justtransform;
    procedure addpicture(slide: TSlide);
    procedure slideshow;
end;


implementation

uses math;

{ TTransImage }

constructor TTransImage.create(Owner: TComponent);
begin
  inherited create(owner);
  Stretch := true;
  Proportional := true;
  Center := true;
setlength(bilderliste,0);
end;


procedure TTransImage.vorbereiten;
begin
setpixelmap;
calcspeed;
end;

procedure TTransImage.justtransform;
begin
render;
end;

procedure TTransImage.direkttransform;
begin
setpixelmap;
calcspeed;
render;
end;



procedure TTransImage.setpixelmap;
var
maxval,dmax,rx,gx,bx,x,y,z: integer;
begin
frame := TBitmap.Create;
frame.Width := startmap.width;
frame.Height := startmap.height;
setlength(pixelmap,frame.width*frame.height);
maxval := 0;
z := 0;
for y := 0 to startmap.height-1 do
  for x := 0 to startmap.Width-1 do begin
  pixelmap[z].x := x;
  pixelmap[z].y := y;
  pixelmap[z].start_r := getrvalue(startmap.Canvas.Pixels[x,y]);
  pixelmap[z].start_g := getgvalue(startmap.Canvas.Pixels[x,y]);
  pixelmap[z].start_b := getbvalue(startmap.Canvas.Pixels[x,y]);

  pixelmap[z].mod_r := getrvalue(startmap.Canvas.Pixels[x,y]);
  pixelmap[z].mod_g := getgvalue(startmap.Canvas.Pixels[x,y]);
  pixelmap[z].mod_b := getbvalue(startmap.Canvas.Pixels[x,y]);

  pixelmap[z].ziel_r := getrvalue(zielmap.Canvas.Pixels[x,y]);
  pixelmap[z].ziel_g := getgvalue(zielmap.Canvas.Pixels[x,y]);
  pixelmap[z].ziel_b := getbvalue(zielmap.Canvas.Pixels[x,y]);

  if pixelmap[z].start_r > pixelmap[z].ziel_r then pixelmap[z].richtung_r := false
    else pixelmap[z].richtung_r := true;
  if pixelmap[z].start_g > pixelmap[z].ziel_g then pixelmap[z].richtung_g := false
    else pixelmap[z].richtung_g := true;
  if pixelmap[z].start_b > pixelmap[z].ziel_b then pixelmap[z].richtung_b := false
    else pixelmap[z].richtung_b := true;

  rx := max(pixelmap[z].start_r,pixelmap[z].ziel_r) - min(pixelmap[z].start_r,pixelmap[z].ziel_r);
  gx := max(pixelmap[z].start_g,pixelmap[z].ziel_r) - min(pixelmap[z].start_g,pixelmap[z].ziel_r);
  bx := max(pixelmap[z].start_b,pixelmap[z].ziel_r) - min(pixelmap[z].start_b,pixelmap[z].ziel_r);

  dmax := max(max(rx,gx),bx);
  pixelmap[z].deltamax := dmax;
  maxval := max(pixelmap[z].deltamax,maxval);
  inc(z);
  end;
totalsteps := maxval;
end;


procedure TTransImage.setratio(ratioval: integer);
begin
Ratio := ratioval;
if ratio < 1 then ratio := 1;
end;

procedure TTransImage.setstartmap(bildname:string);
begin
startmap.Free;
startmap := TBitmap.Create;
startmap.LoadFromFile(bildname);
end;

procedure TTransImage.setzielmap(bildname: string);
begin
zielmap.Free;
zielmap := TBitmap.Create;
zielmap.LoadFromFile(bildname);
end;

procedure TTransImage.calcspeed;
var
z : integer;
begin
for z := low(pixelmap) to high(pixelmap) do begin
  pixelmap[z].speed_r := (max(pixelmap[z].ziel_r,pixelmap[z].start_r)
                         -min(pixelmap[z].ziel_r,pixelmap[z].start_r))
                         /totalsteps;
  pixelmap[z].speed_g := (max(pixelmap[z].ziel_g,pixelmap[z].start_g)
                         -min(pixelmap[z].ziel_g,pixelmap[z].start_g))
                         /totalsteps;
  pixelmap[z].speed_b := (max(pixelmap[z].ziel_b,pixelmap[z].start_b)
                         -min(pixelmap[z].ziel_b,pixelmap[z].start_b))
                         /totalsteps;
end;
end;



procedure TTransImage.render;
var
z : integer;
begin
if (startmap.Width <> zielmap.Width) or (startmap.Height <> zielmap.Height) then
  showmessage('Ungleiche Bildgrössen. Darstellungsfehler möglich..!!');
clock := 0;
repeat
for z := low(pixelmap) to high(pixelmap) do modpixel(z);
Picture.Assign(frame);
application.ProcessMessages;
inc(clock,ratio);
caption := inttostr(clock);
until clock > totalsteps;
Picture.Assign(zielmap);
end;

procedure TTransImage.modpixel(mappos: integer);
var
xpos,ypos,r,g,b : integer;
begin
xpos := pixelmap[mappos].x;
ypos := pixelmap[mappos].y;
r := pixelmap[mappos].mod_r;
g := pixelmap[mappos].mod_g;
b := pixelmap[mappos].mod_b;

if (pixelmap[mappos].ziel_r-pixelmap[mappos].start_r) <> 0 then
  if pixelmap[mappos].richtung_r = true then inc(r,round(clock*pixelmap[mappos].speed_r))
    else dec(r,round(clock*pixelmap[mappos].speed_r));

if (pixelmap[mappos].ziel_g-pixelmap[mappos].start_g) <> 0 then
  if pixelmap[mappos].richtung_g = true then inc(g,round(clock*pixelmap[mappos].speed_g))
    else dec(g,round(clock*pixelmap[mappos].speed_g));

if (pixelmap[mappos].ziel_b-pixelmap[mappos].start_b) <> 0 then
  if pixelmap[mappos].richtung_b = true then inc(b,round(clock*pixelmap[mappos].speed_b))
    else dec(b,round(clock*pixelmap[mappos].speed_b));
frame.Canvas.Pixels[xpos,ypos] := rgb(r,g,b);
end;

procedure TTransImage.addpicture(slide: TSlide);
begin
setlength(bilderliste,length(bilderliste)+1);
bilderliste[high(bilderliste)].bild := slide.bild;
bilderliste[high(bilderliste)].delay := slide.delay;
end;

procedure TTransImage.slideshow;
var
x : integer;
begin
setstartmap(bilderliste[0].bild);
picture.Assign(startmap);
application.ProcessMessages;
sleep(bilderliste[0].delay);
for x := low(bilderliste) to high(bilderliste) -1 do begin
 if x > low(bilderliste) then sleep(bilderliste[x].delay);
setstartmap(bilderliste[x].bild);
setzielmap(bilderliste[x+1].bild);
direkttransform;
end;

end;


end.



Habt Spass damit.... (Wird noch Dokumentiert)


Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.


Zuletzt bearbeitet von catweasel am Mo 01.03.04 11:49, insgesamt 3-mal bearbeitet
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 02.03.04 22:18 
Hallo,

was mir auf den ersten Blick auffällt und auch missfällt, ist die schlechte Formatierung. Da sind wenige Einrückungen im code. Desweiteren ist
Zitat:
{ TTransImage }
der einzigste Kommentar im ganzen quelltext, und er ist auch niche mal von Dir :roll: . Und die eigentliche Klassendeklaration hält sich nicht an das übliche, für mich wäre es übersichtlicher, wenn bei den privaten Feldern immer ein F davorsteht, wie es in Delphi auch ist www.delphi-source.de...undlagen/styleguide/ . Auch ein wenig störend finde ich die Prozedurnamen
Zitat:
vorbereiten und justtransform
, für OpenSource sollte man sich vielleicht doch ein wenig Mühe geben und die Namen in einer Sprache halten.

Ausprobiert habe ich es nicht, aber ich denke, das codemäßig einige große Fehler drin sind:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  TTransPixel = record 

    start_r : integer; 
    start_g : integer; 
    start_b : integer; 
    speed_r : real; 
    speed_g : real; 
    speed_b : real; 

  end;



procedure TTransImage.setpixelmap;

setlength(pixelmap,frame.width*frame.height);

• Real sollte man nicht mehr verwenden
• Öhm, was tust du hier eigentlich? Dein Record Transpixel hat eine Größe von 80Bytes und die packst du dann in ein dynamisches array. Also bei 800x600 ein astronomischer Speicherbedarf von 800*600*80Bytes :roll: . Das Record ist für mich schon völlig falsch dimensioniert.
Die RGB-Werte sind doch nur bytes, keine Integer. Zu überlegen wäre, ob ein single mit 4 bytes statt einem double mit 8bytes auch tut. Wobei sich für mich die Frage überhaupt stellt, warum du diesen Zwischenschritt überhaupt gehst. Das dein Code so langsam ist, liegt mit Sicherheit auch daran, das du Canvas.pixels verwendest und jedes Pixel erst in die Farbbestandteile zerlegst und die dann wieder mit RGB in eine Farbe wandelst. Warum nimmt du nicht die scanline-Eigenschaft? In Verbindung mit einer bitmap im pixelformat pf24bit (entsprechend setzen) hast du schon zu jeden Pixel ein RGB-Farbtriple.
Lesenswert : www.efg2.com/Lab/Ima...cessing/Scanline.htm , auch der Punkt optimization. Wenn du über Scanlines gehst, kannst du dir große Teile deines Codes sparen und auch gleich direkt mit den Start und Zielbitmaps arbeiten. Wenn du dich auf der efg-seite einwenig umsiehst, findest du mit Sicherheit auch noch ein Fade-Beispiel.

Auch reservierst du dir mit setlength Speicher, die nach Beendigung des Zeichnens nicht mehr freigegeben werden. Ich würde dir mal das Programm Suche in: Delphi-Forum, Delphi-Library MEMPROOF ans Herz legen, mit dem findest du solche Speicherlecks. Das gleiche betrifft die Bilderliste und
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TTransImage.setstartmap(bildname:string);
begin
startmap.Free;
startmap := TBitmap.Create;
startmap.LoadFromFile(bildname);
end;

Hier sehe ich nicht durch, was du tust. Startmap.free , hier hast du Dusel, das keine Exception kommt. Liegt vielleicht daran, das deine Startmap erstmal Nil ist und beim Free destroy nur aufgerufen wird, wenn das objekt <>Nil ist. Ansonsten ist hier keine Bitmap erstellt wurden und was nicht da ist, kannst du auch nicht freigeben und das free führt zur exception. Viel schlimmer ist es noch bei frame:=Tbitmap.create; hier fehlt das free ja völlig. Mit jedem aufruf von setpixelmap wird dein speicherbedarf schön steigen.
Auch fehlt hier das startmap.free beim beenden. Ich würde das erstellen in den Constructor packen und das freigeben in den destructor. Das freigeben und neuerstellen finde ich unnötig, das einmalige Erzeugen, zum Schluß freigeben und loadfromfile reicht aus. Wobei die meisten komponenten da auch anders gestrickt sind. Einer imagekomponten übergibst du doch auch gleich eine Bitmap und nicht den dateinamen.

Außerdem fehlen in deinem Code auch Überprüfungen, was passiert, wenn der user einen dateinamen angibt, der nicht stimmt?

ausblenden Delphi-Quelltext
1:
2:
if (startmap.Width <> zielmap.Width) or (startmap.Height <> zielmap.Height) then
  showmessage('Ungleiche Bildgrössen. Darstellungsfehler möglich..!!');

Mit canvas.pixels arbeite ich nicht. Bei Verwendung der scanlines – eigenschaft siehst du beim Lesen/Schreiben der einzelnen Pixel bei unterschiedlicher Bildgröße mit Sicherheit eine AV. Wenn die Bildgrößen unterschiedlich sind, hat für mich das Weitermachen eh nicht sinnvoll.

So, genug geschrieben ;)

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mi 03.03.04 02:14 
Hi,

erst mal Danke für die Eindrücke zu der Unit...

Zitat:
der einzigste Kommentar im ganzen quelltext, und er ist auch niche mal von Dir . Und die eigentliche Klassendeklaration hält sich nicht an das übliche, für mich wäre es übersichtlicher,

Hmmm ok. Vielleicht. Aber ich finde in diesem Fall keinne "Ecke" im Code die nicht auf den ersten Blick zumindest von der Gliederung her unübersichtlich wäre ?! Sämtliche geschachtelten IFs und FORs sind entsprechend eingerückt....
Das mit den Namen und Namenspräfixen ist aber etwas gegen das ich mich hartnäkig sträube.. Ich möchte sie so benennen wie ich will.
Dabei versuche ich aber sinnvolle namen zu finden...

Zitat:
Auch ein wenig störend finde ich die Prozedurnamen
für OpenSource sollte man sich vielleicht doch ein wenig Mühe geben und die Namen in einer Sprache halten.

Das mit der zweisprachigkeit hat folgende Ursachen:
Ich versuche zwar bei den Deklarationen grob in einer Sprache zu bleiben und wechsele die Sprache nur wenn der Name denn ich im Sinn habe in der anderen Sprache zu umständlich wäre... Z.B. habeich mir schon überlegt die Prozedur justtransform(); als nurtransformieren();, oder setpixelmap auch erstellepixelkarte zu nennen... Ich weiss das ist gegen jeden Standart und Konvention und wäre Delphi eine Religion würde ich sofort exkommuniziert ;-) In der Regel sind es die englischen Bezeichnungen die kürzer sind, was mit der Informationseffizienz der englischen Sprache an sichzusammenhängt....
.. aber es ist ja auch so das man, wenn man einen Gedanken fasst dazu im Kopf unbewusst Worte formuliert. Und mein "Problem" ist das mein Englisch Level soweit ist das es für mich keinen Unterschied mehr zu meiner Muttersprache Deutsch gibt...(Ich denke oder träume z.b. auf teilweise auf englisch) Ich miche die Sprachen beim Programmieren, bei Notitzen, etc, ohne es zu merken .. :o

Aber an dieser Stelle möchte ich den Styleguide mal hinterfragen:

Situation früher : Be*?!#ssenes Basic wo jede Stringvariable garantiert ein "$" vorangestellt haben muss.
Bezeichner dürfer zwar auch mal länger sein, aber es werden nur die ersten zwei zeichen interpretiert (C-128).
(Ergibt interessante Debugging Erlebnisse bei verwendung zweier fast identischer Variablennamen in einer Schleifenkonstruktion bei
der eine die Loop Variable ist :shock:

Dann kamen : Hochsprachen (Ich zähle Basic nicht zu den Hochsprachen). Und alles war auf einmal voll geil....
Endgültig (fast) freie Wahl von Bezeichnernamen.
Keine Probleme mehr mit ähnlichen Namen...und und und...

Warum soll man sich jetzt wieder selbst was auferlegen.. ?! Sofern die Variable im Deklarationsteil kommentiert wird (welchen Wert sie enthält und wozu dieser verwendet wird), sollte es doch kein Unterschied machen, ob ein spezieller Bezeichnername mit F oder ohne F beginnt ???? oder ???

Zitat:
Ausprobiert habe ich es nicht, aber ich denke, das codemäßig einige große Fehler drin sind:

Also zumeindest keine "Fehler" im Sinne von Funktionalität.
Die Unit funktioniert schon fehlerfrei.. Sie transformiert Bilder.....
Wenn du mit "Fehler" allerdings "umständlich" meinst, dann könnte was dran sein. Aber gehen zut sie so wie sie is....

Zitat:
astronomischer Speicherbedarf von 800*600*80Bytes

Nicht nur Microsoft kann resourcenfressendenCode produzieren.. Das ist der "Bill Gates Flavour".. :D :wink:
Nee mal ernsthaft:
Was genau meinst du mit "Zwischenschritt" ?
Ich nehme das Bild.. rechne aus welcher Subpixel "es am weitesten hat" (Differenz zwwischen Start und ziel).. Der "Weg" ist die gesamtlänge der Transformation. Daran wird die Speed für jeden Wert festgelegt, sodass alle Pixel zur sleben Zeit "ankommen".....
Das wird dann in ein Frame gezeichnet und dargestellt.....
Das was so lange dauert ist eben das rausknobeln der einzelnen Speedparameter für sie Subpixel.....

Zitat:
Hier sehe ich nicht durch, was du tust. Startmap.free , hier hast du Dusel, das keine Exception kommt. Liegt vielleicht daran, das deine Startmap erstmal Nil ist und beim Free destroy nur aufgerufen wird, wenn das objekt <>Nil ist. Ansonsten ist hier keine Bitmap erstellt wurden und was nicht da ist, kannst du auch nicht freigeben und das free führt zur exception.

Hmm also eigentlich löst ein free ohne Objekt zum freen kaum eine Exception aus, da eben, wie du sagst, auf NIL geprüft wird.. Das ist bei mir stets der Fall... Steht sogar in Delphi Büchern die ich hab. Im Zusammenhang mit Destroy wird dort gesagt :"Rufen sie Destroy nie direkt auf, sondern verwenden sie grundsätzlich free, da dieses destroy aufruft, vorher jedoch prüft ob das Objekt existiert. Ein direkter Aufruf von Destroy fürt in diesem Fall zu einer Exception"....
Zitat:
Viel schlimmer ist es noch bei frame:=Tbitmap.create; hier fehlt das free ja völlig. Mit jedem aufruf von setpixelmap wird dein speicherbedarf schön steigen.

Nein, eigentlich nicht... es steht genau eine Zeile davor.......

Es passiert dabei folgendes (sollte zumindest......:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TTransImage.setstartmap(bildname:string); 
begin 
startmap.Free;                                   // Wenn es eine Startmap gibt.. dann spätestens jetzt nicht mehr..... 
                                                        // wenns keine gab, macht nix, free prüft ja
startmap := TBitmap.Create;             // eine Startmap wurde erstellt und sie ist garantiert die Einzige....
startmap.LoadFromFile(bildname);     // Sie bekommt ihr Bildchen......
end;


Das Ergebnis: Bei jedem Aufruf vom Setstartmap wird die aktuelle srtartmap freigegeben und eine neue erstellt.....
DAs sollte doch recht leicht nachzuvollziehen sein, oder ?

Zitat:
Mit canvas.pixels arbeite ich nicht. Bei Verwendung der scanlines – eigenschaft siehst du beim Lesen/Schreiben der einzelnen Pixel bei unterschiedlicher Bildgröße mit Sicherheit eine AV. Wenn die Bildgrößen unterschiedlich sind, hat für mich das Weitermachen eh nicht sinnvoll

Deswegen arbeite ich ja mit dem Canvas.......
nicht sinnvoll ?Naja, versuch doch einfach mal das transformen von verschieden grossen Bildern. Die Klasse erlubt es. Es ist ja nur ein Warnhinweis.....
Es macht schon Sinn..Die Bilder sind zentriert und überstehende Bereiche des Grösseren transformen in den Hintergrund, aus dem Hintergrund.....
In meiner Version ist die transformation noch linksbündig (bei Transformation von gross auf kleiner) nur der endframe wird zentriert ausgegeben.
Aber sooo sinnlos isses echt nicht. Auch vorstellbar.:
Ein kleines Bild (z.b. Logo) wird in ein grösseres an einer bestimmten Stelle "eingefaded" ohne das dazu zwei Komponenten übereinander gebappt werden müssen...

DAs ganze ist auch inzwischen ausführlich dokumentiert. Habe aber immernoch keinen geeigneten Webspace Provider gefunden.. Jeder hat irgendwie nen anderen Haken... :roll:
Werde mich aber bemühen das ganze (inkl. Demoprogramm) bald wieder online zustellen....

Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 04.03.04 21:31 
Hallo

Zitat:

Aber ich finde in diesem Fall keinne "Ecke" im Code die nicht auf den ersten Blick zumindest von der Gliederung her unübersichtlich wäre ?!

echt?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TTransImage.slideshow;
var
x : integer;
begin
setstartmap(bilderliste[0].bild);
picture.Assign(startmap);
application.ProcessMessages;
sleep(bilderliste[0].delay);
for x := low(bilderliste) to high(bilderliste) -1 do begin
 if x > low(bilderliste) then sleep(bilderliste[x].delay);
setstartmap(bilderliste[x].bild);
setzielmap(bilderliste[x+1].bild);
direkttransform;
end;

end;

wo gehören auf Anhieb die 2 ends hin? so wie das if eingerückt ist, sieht es so aus, als ob nur das if zur Schleife gehört und die Befehle darunter nicht mehr.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TTransImage.slideshow;
var x : integer;
begin
  setstartmap(bilderliste[0].bild);
  picture.Assign(startmap);
  application.ProcessMessages;
  sleep(bilderliste[0].delay);
  for x := low(bilderliste) to high(bilderliste) -1 do
    begin
      if x > low(bilderliste) then sleep(bilderliste[x].delay);
      setstartmap(bilderliste[x].bild);
      setzielmap(bilderliste[x+1].bild);
      direkttransform;
    end;
end;

würd ich bevorzugen. aber egal, mach ruhig ;)

Zitat:

Ich weiss das ist gegen jeden Standart

entweder du schreibst "gegen jede Standart" oder "gegen jeden Standard". Standard ist wohl das am meisten falsch geschrieben Wort im Forum, diese kleine Bemerkung konnte ich mir nicht verkneifen ;) :mrgreen:

Zitat:

sollte es doch kein Unterschied machen, ob ein spezieller Bezeichnername mit F oder ohne F beginnt ???? oder ???

wenn du Propertys arbeitest (was in deinem Fall vielleicht auch nicht verkehrt wäre) wirst dus automatisch machen. Dann weißt du sofort, wann du mit einer privaten Variable arbeitest und wann nicht. Wenn du die Klassenvervollständigung nutzt (ab Pro-Version) macht Delphi das F sogar automatisch.

Zitat:

Das was so lange dauert ist eben das rausknobeln der einzelnen Speedparameter für sie Subpixel.....

nein, was solange dauert ist dein canvas.pixels

zu deinem Free:
Was du machst wenn du ein Haus neu anstreichen willst: Haus einreißen, neu aufbauen und dann streichen. reichen würde es aber auch, wenn du dein Haus einmalig baust, im Laufe deines Lebens x mal pinselt und wenn dus nicht mehr brauchst, reißt dus ab.
Sowie du das machst, wirst du das nirgends finden. und beim frame fehlt das free völlig, da steht nix eine Zeile weiter drüber.
auch fehlt dir das Freigeben beim beenden völlig.

Zitat:

Deswegen arbeite ich ja mit dem Canvas.......

das geht mit scanlines auch, nur eben schneller. Du mußt nur deinen Source so aufbauen, das du mögliche Fehler auschließt. aber mit dem richtigen Aufbau sind auch
Zitat:

Ein kleines Bild (z.b. Logo) wird in ein grösseres an einer bestimmten Stelle "eingefaded" ohne das dazu zwei Komponenten übereinander gebappt werden müssen...

sehr wohl möglich.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Do 04.03.04 23:50 
Zitat:
wo gehören auf Anhieb die 2 ends hin? so wie das if eingerückt ist, sieht es so aus, als ob nur das if zur Schleife gehört und die Befehle darunter nicht mehr.

Ok. Ich geb zu. Die Slideshow funktion hab ich so auf sie schnelle hingecoded, aber gleich nach dem begin der Prozedur einzurücken . hmmm *augenbraue hochzieh* ;-)
Wegen dem eingerückten if..:
Ich rücke immer dann ein wenn ein neuer eingeschobener Block beginnt. Es ist da etwas verwirrend.. Die 3 Zeilen drunter sollten an selbiger Spaltenzahl wie das iff eigentlich stehen... und bei dem
.....do begin
end;

, oder

... do
begin
end;

finde ich es übersichtlicher wenn ein begin aleine in einer Zeile den Beginn einer Funktion/Prozedur einleitet.. Aber ist sicher geschmackssache :-)

Zitat:
entweder du schreibst "gegen jede Standart" oder "gegen jeden Standard". Standard ist wohl das am meisten falsch geschrieben Wort im Forum, diese kleine Bemerkung konnte ich mir nicht verkneifen

Stimmt. Und ich weiss auch genau woran das liegt. Hab zumindest eine äusserst plausible Theorie darüber. Aber das ist ein anderes Thema ;-)

Zitat:
Wenn du die Klassenvervollständigung nutzt (ab Pro-Version) macht Delphi das F sogar automatisch.

Ich benutze Delphi 6 Enterprise . Mir ist beim Klassenvervollständigen aber noch nie so ein Verhalten aufgefallen .. :shock:

Zitat:
nein, was solange dauert ist dein canvas.pixels

Das hat sich mir aber anders dargestellt. Ursprünglich hatte ich ja nur eine dirkete Transformation im Sinne. Mit dem Effekt:
Transformationsfunktion aufgerufen... Erstmal passiert nen Moment nix.. Dann transformt es.....
Füge infach mal nen Showmessage nach vorbereiten ein..


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
begin
vorbereiten;
showmessage('Pixelmap complete. Speed parameter set.');
justtransform;
end;


Das Vorbereiten könnte man per Showmessage nochmal in Einzelschritte zwischen setpixelmap und calcspeed unterteilen, wobei auffallen wird, das calcspeed im Prinzip noch am wenigsten Zeit benötigt....(war vorher anders rum) . Die Zeit zwischen Transformaufruf und sichtbarem Beginn der Transformation geht definitiv beim Anlegen der Pixelmap drauf....
Das Transformen mit Canvas geht danach sofort und flüssig ohne flackern los.......
Daraus habe ich den Schluss gezogen dass das Pixelsetzen solange dauert... Oder flackert es bei dir ?


Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Fr 05.03.04 10:14 
Was das überblenden der Bitmaps angeht, hatten wir vor kurzem einen Topic. Schau mal hier: www.delphi-forum.de/...?t=22454&start=0. Dort ging es hauptsächlich darum, wie man den übergang zwischen 2 Bitmaps schneller darstellen kann.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 05.03.04 20:15 
Hallo

Zitat:

Ich benutze Delphi 6 Enterprise . Mir ist beim Klassenvervollständigen aber noch nie so ein Verhalten aufgefallen ..


du schreibst
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
...
  public
    { Public-Deklarationen }
    property WasWeissIchWas:integer;
  end;
...

(das Semikolon muß sein)
und rechtsklick drauf und Klasse beim Cursor vervollständigen
delphi macht dann das draus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  private
    FWasWeissIchWas: integer;

    procedure SetWasweissichwas(const Value: integer);
  public
    { Public-Deklarationen }
    property WasWeissIchWas:integer read FWasWeissIchWas write SetWasWeissIchWas;
  end;
...
implementation

procedure TForm1.SetWasweissichwas(const Value: integer);
begin

end;


Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)