![]() |
Pixel eines Bildes spiralförmig auslesen
Hi,
eigentlich sollte die Aufgabe nicht so schwer sein, aber momentan fehlt mir irgendwie der richtige Ansatz ... :-( Ich möchte gern die Pixel eines Bildes "spiralförmig" auslesen - ungefähr so: Obere Zeile von links nach rechts auslesen ... runter bis Bildende ... nach Links bis zum linken Bildrand ... hoch bis zur zweiten Zeile ... nach rechts bis zur vorletzen Position ... ... und so weiter .... bis man in der Bildmitte angekommen ist. Vielleicht hat ja schon einmal jemand so etwas gemacht, oder eine nette Idee für die Lösung! bis denne, Hannes |
Re: Pixel eines Bildes spiralförmig auslesen
na das sollte doch nicht schwierig sein.... wird aber ne ziemliche schleifenschachtlerei :mrgreen:
Delphi-Quellcode:
iss es dank sturktuiertem programmmieren gar nicht mal geworden....
function readhor(start:integer;ending:integer;y:integer;bit:TBitmap):TBitMap;
var i:integer; begin Result:=TBitMap.create; //geht das überhaupt? wenn nicht, muss mans halt mit var-params machen. result.width:=start-ending; result.height:=1; if start <= ending then for i := start to ending do result.canvas.pixels[i,0]:=bit.canvas.pixels[i,y] else for i := start downto ending do result.canvas.pixels[i,0]:=bit.canvas.pixels[i,y]; //das ganze würde mit copyrect wohl sehr viel performanter... end; function readvert(start:integer;ending:integer;x:integer;bit:TBitmap):TBitMap; var i:integer; begin Result:=TBitMap.create; //geht das überhaupt? result.height:=start-ending; result.width:=1; if start <= ending then for i := start to ending do result.canvas.pixels[0,i]:=bit.canvas.pixels[y,i] else for i := start downto ending do result.canvas.pixels[i,0]:=bit.canvas.pixels[i,y]; //das ganze würde mit copyrect wohl sehr viel performanter... end; procedure spiralize(bit:TBitmap); var i:integer; widthleft,widthstart:integer; heightleft,heightstart:integer; begin widthleft:=bit.width; heightleft:=bitmap.height; widthstart:=0; heightstart:=0; while widthleft > 0 do begin //einmal rundherum readhor(widthstart,widthleft-1,heightstart,bit); //nach rechts... inc(heightstart); dec(heightleft); readvert(heightstart,heightleft-1,widthleft-1,bit); //...nach unten.... inc(widthstart); dec(widthleft); readhor(widthleft-1,widthstart,heightleft-1,bit);//...nach links... inc(heightstart); dec(heightleft); readvert(heightleft-1,heightstart,widthstart,bit);//...und wieder zurück! inc(widthstart); dec(widthleft); end; end; prinizpiell sollte das stimmen, aber die ganzen incs und decs müssen überprüft werden. EDIT: usability: einfach die rückgabewerte von readhor und readvert "einfangen" ;) EDIT2: jaja, die reservierten ausdrücke..... |
Re: Pixel eines Bildes spiralförmig auslesen
Du solltest den zweiten Parameter von readvert und readhorz umbenennen :wink: .
|
Re: Pixel eines Bildes spiralförmig auslesen
oha stimmt... wird gemacht.
(ich hatte ja vorhin from und to, aber das geht ja auch nicht.... sch**** reservierte Ausdrücke..... :roll: ) |
Re: Pixel eines Bildes spiralförmig auslesen
@DGL-luke: Allerbesten Dank!!!
Auf die zwei Funktionen hätte ich auch selbst kommen können. Ich war gedanklich immer in einer verschachtelten Schleife ... und das hat mich dann verwirrt :-) |
Re: Pixel eines Bildes spiralförmig auslesen
Ist es nicht extrem langsam Canvas.Pixels anzusprechen?
|
Re: Pixel eines Bildes spiralförmig auslesen
Zitat:
![]() Ich glaube ich schreibe mal ein Programm zum Vergleich. |
Re: Pixel eines Bildes spiralförmig auslesen
@Khabarakh: Du musst Dir aber nicht die Mühe machen. Mir ging es eher ums Prinzip. Probieren wollte ich das Ganze eh in Java. Und da ist der schnellste Weg über das pixel[] - Array ...
|
Re: Pixel eines Bildes spiralförmig auslesen
*räusper* alle sagen immer, kommentiert euren code, und dann liest die kommetnare keiner.....
ich hab doch geschrieben Zitat:
EDIT: @ noch_ein_hannes: ich wollte auch erst ne irre schleifenschachtelung machen, aber dann dachte ich mir "da fängst du jetz mla an das ganze in funktionen zu kapseln und dann wird das sehr viel schöner...." |
Re: Pixel eines Bildes spiralförmig auslesen
Hi DGL-luke,
Deinen Performance-Hint hatte ich auch gelesen und mich dann über die anderen gewundert ... Zitat:
die Procedure spiralize() ist glaube ich nicht so ganz korrekt. Die inc's und Dec's hattest Du ja schon empfohlen zu prüfen, aber grundsätzlich reicht es bestimmt als Obergrenze für den Startpunkt bzw. die Länge einer Seite die halbe Breite / Höhe zu definieren. Momentan ist es hier recht busy, - ich werde es bei Gelegenheit mal ausprobieren. grüsse, Hannes |
Re: Pixel eines Bildes spiralförmig auslesen
Zitat:
|
Re: Pixel eines Bildes spiralförmig auslesen
Dann will ich es mal ein wenig genauer erklären:
Ich möchte gern alle Pixel eines Bildes um jeweils eine Position auf der Spiralbahn verschieben. Es sollte dann so eine Art eckiger Strudel entstehen bei dem dann mit der Zeit alle Pixel in der Bildmitte verschwinden. Oder umgekehrt alle Pixel wandern "spiralförmig" aus der Mitte zur linken oberen Ecke. |
Re: Pixel eines Bildes spiralförmig auslesen
Zitat:
Müsste aber zu schaffen sein. Im Notfall erstellt man sich 'ne Tabelle, mit 'ner Zelle für jeden Pixel (soll keine Empfehlung sein ((( wäre aber noch lustiger als der eben beschriebene Effekt :-D ))) ). |
Re: Pixel eines Bildes spiralförmig auslesen
Besteht das Problem bzw. Interesse an der Lösung desselben noch?
|
Re: Pixel eines Bildes spiralförmig auslesen
Hi Khabarakh,
Hast Du etwa eine Lösung? Das würde mich dann schon mal interessieren ... :-) Grüsse, Hannes |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 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