![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 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