Autor |
Beitrag |
maxrus
Beiträge: 20
|
Verfasst: Mi 09.11.11 18:12
Hallo, ich habe folgende Aufgabe,
Ein Formular enthalte 2 Imagefelder von dem das erste folgendermaßen initialisiert wird:
Delphi-Quelltext 1: 2: 3: 4: 5:
| image1.Canvas.Pixels[0,0]:=$FF; image1.Canvas.Pixels[0,2]:=$FF00; image1.Canvas.Pixels[2,0]:=$FFFF; image1.Canvas.Pixels[2,2]:=$FF0000; image1.Canvas.Pixels[3,0]:=255; |
Aufgabe des Programms ist, auf Knopfdruck diese Pixel im zweiten Imagefeld in Vergrößerter Darstellung abzubilden. Die lineare Vergrößerung ist in Pixeln in einem Spineditfeld einzugeben. Auf Knopfdruck wird die Vergrößerung mittels einzelner Pixel dargestellt. Alle Koordinaten der Zielrechtecke sind per Programm zu berechnen.
Kann mir jemand paar Tipps geben, wie ich vorgehen soll.... ich weiß nicht wie ich diese Pixels auslesen soll, und dann spineditfeld mit imagefeld verknüpfen wüßte ich auch nicht.
Moderiert von Christian S.: Delphi-Tags hinzugefügt
Moderiert von Christian S.: Topic aus Multimedia / Grafik verschoben am Mi 09.11.2011 um 18:27
|
|
Horschdware
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Mi 09.11.11 18:28
Die brutal einfachste "Quick-and-Dirty"-Methode wäre es, die Stretch-Funktion von TImage zu nutzen.
Setze die Größe des ersten Images auf das mindeste was du brauchst (z.B. 10x10 Pixel).
Setze dann die Größe des zweiten Images auf die Größe des ersten * Skalierungsfaktor.
Delphi-Quelltext 1: 2: 3:
| skalierung := SpinEdit1.Value; Image2.Height := Image1.Height * skalierung; Image2.Width := Image1.Width * skalierung; |
Setze dann die Property "Streched" des zweiten Images auf true.
Übergebe dann dem zweiten Image die Bitmap des ersten:
Delphi-Quelltext 1:
| Image2.Picture.Bitmap := Image1.Picture.Bitmap; |
Zur einfachen Darstellung sollte das genügen. Wenn du das aber "sauber" und "richtig" machen willst, musst du wohl ein Bisschen mehr Aufwand betreiben
Denkbar wäre (wenn du ohnehin schon das Quellbild pixelweise aufbaust) das Zielbild auch pixelbasiert mit einem Skalierungsfaktor zu bauen. In etwa so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var x,y,zielx,ziely,faktor : integer; begin faktor := 20; for x:=0 to 4 do for y:=0 to 4 do for zielx:=0 to faktor do for ziely:=0 to faktor do begin Image2.Canvas.Pixels[faktor*x +zielx ,faktor*y +ziely] := Image1.Canvas.Pixels[x,y];
Sleep(0); Application.ProcessMessages; end; end; |
_________________ Delphi: XE - OS: Windows 7 Professional x64
Für diesen Beitrag haben gedankt: maxrus
|
|
maxrus
Beiträge: 20
|
Verfasst: Mi 09.11.11 18:46
das was du mit "sauber" und "richtig" bezeichnest, ist genau das was ich brauche!!! Danke
Moderiert von Martok: Komplettzitat des vorigen Beitrags entfernt.
|
|
bummi
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 09.11.11 20:00
Zitat: |
Alle Koordinaten der Zielrechtecke sind per Programm zu berechnen
|
unter diese Vorgaben ist die Lösung von Horschdware sauber und richtig
Es macht keinen Sinn die Canvasauflösung zu ändern, StretchBlt oder GDI+ Routinen zu verwenden ...
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 09.11.11 23:11
Moin!
bummi hat folgendes geschrieben : | Zitat: | Alle Koordinaten der Zielrechtecke sind per Programm zu berechnen
|
unter diese Vorgaben ist die Lösung von Horschdware sauber und richtig |
Fehlt da nicht ein "nicht"?
Da die Aufgabe und der Lösungsweg recht präzise beschrieben ist, würde ich sagen, dass mit Rechtecken, statt mit Pixeln gezeichnet werden soll!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
bummi
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 09.11.11 23:27
@Narses, jepp, sorry
Du kennst das doch, wenn man Sätze liest in denen Dreher sind, man merkt es u.U. gar nicht
Ich hatte gelesen ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var x,y,zielx,ziely,faktor : integer; begin for x := 0 to 4 do for y := 0 to 4 do Image1.Canvas.Pixels[x,y] := Random(255)*256*256 + Random(255)*256 + Random(255); faktor := 20; for x:=0 to 4 do for y:=0 to 4 do begin Image2.Canvas.brush.Color := Image1.Canvas.Pixels[x,y]; Image2.Canvas.Fillrect(Rect(faktor*x,faktor*y,faktor*(x + 1),faktor*(y+1))); end; end; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
maxrus
Beiträge: 20
|
Verfasst: Fr 11.11.11 14:34
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 11.11.11 14:46
Moin!
maxrus hat folgendes geschrieben : | Hat jemand Idee warum das nicht geht?"!?! |
Den Wert des SpinEdit findest du in der Eigenschaft .Value.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
maxrus
Beiträge: 20
|
Verfasst: Fr 11.11.11 15:09
|
|
Horschdware
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Fr 11.11.11 15:48
Schau dir mal den Typ von Valuean.
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
maxrus
Beiträge: 20
|
Verfasst: Fr 11.11.11 16:21
Horschdware hat folgendes geschrieben : | Schau dir mal den Typ von Valuean. |
irgendwie suche ich wahrscheinlich falsch, im internet gibts zwar paar beispiele, aber die sind zu umfassend nicht für mein fall gedacht, und bei einigen steht strtoint(Spinedit.value), bei anderen strtoint(SpinEdit1.text)->>>>> wo ist der unterschied, das eine ist integer und das andere string....?????? kann mir jemand schreiben wie ich das umwandeln kann?????
|
|