Entwickler-Ecke
Multimedia / Grafik - "Bild vergrößern", bzw. Pixel
maxrus - Mi 09.11.11 18:12
Titel: "Bild vergrößern", bzw. Pixel
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 - 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; |
maxrus - 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 - 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 ...
Narses - 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"? :gruebel:
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! :idea:
cu
Narses
bummi - 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; |
maxrus - Fr 11.11.11 14:34
Horschdware hat folgendes geschrieben : |
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:
| var x,y,zielx,ziely,faktor : integer; begin faktor := 20; | |
Was mich interessieren würde, wie kann ich diesen faktor := 20; aus dem spineditfeld auslesen, ich habe mir einfach gedacht faktor:=strtoint(spinedit1.text), dann könnte ich selber mein vergrößerungsfaktor einstellen, aber irgendwie geht das nicht....
Hat jemand Idee warum das nicht geht?"!?!
Moderiert von
Narses: Zitat gekürzt.
Narses - 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. :idea:
cu
Narses
maxrus - Fr 11.11.11 15:09
Narses hat folgendes geschrieben : |
Den Wert des SpinEdit findest du in der Eigenschaft .Value. :idea:
|
hat spinedit keine string eigenschaft? oder was meinst du?
Moderiert von
Martok: Beiträge zusammengefasst & Quotes repariert
ich habe jetzt geschrieben faktor:=strtoint(SpinEdit1.value); geht trotzdem nicht, im internet kann ich auch nicht so viel dazu finden.... :(
Horschdware - Fr 11.11.11 15:48
Schau dir mal den Typ von Valuean.
maxrus - 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?????
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!