Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Pixel eines Bildes spiralförmig auslesen (https://www.delphipraxis.net/44439-pixel-eines-bildes-spiralfoermig-auslesen.html)

noch_ein_hannes 19. Apr 2005 14:54


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

DGL-luke 19. Apr 2005 15:52

Re: Pixel eines Bildes spiralförmig auslesen
 
na das sollte doch nicht schwierig sein.... wird aber ne ziemliche schleifenschachtlerei :mrgreen:

Delphi-Quellcode:
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;
iss es dank sturktuiertem programmmieren gar nicht mal geworden....

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.....

Khabarakh 19. Apr 2005 16:10

Re: Pixel eines Bildes spiralförmig auslesen
 
Du solltest den zweiten Parameter von readvert und readhorz umbenennen :wink: .

DGL-luke 19. Apr 2005 16:15

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: )

noch_ein_hannes 19. Apr 2005 17:24

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 :-)

Die Muhkuh 19. Apr 2005 17:26

Re: Pixel eines Bildes spiralförmig auslesen
 
Ist es nicht extrem langsam Canvas.Pixels anzusprechen?

Khabarakh 19. Apr 2005 17:36

Re: Pixel eines Bildes spiralförmig auslesen
 
Zitat:

Zitat von Spider
Ist es nicht extrem langsam Canvas.Pixels anzusprechen?

Noch langsamer geht es nicht. Scanline wäre schon eine extreme Verbesserung, noch schneller ginge es mit der GR32-Lib und TBitmap32.Bits, sogar mit MMX-Unterstützung :mrgreen: .
Ich glaube ich schreibe mal ein Programm zum Vergleich.

noch_ein_hannes 19. Apr 2005 17:56

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 ...

DGL-luke 19. Apr 2005 22:01

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:

//das ganze würde mit copyrect wohl sehr viel performanter...
also echt.... aber es ist schön, dass an dem restlichen code nichts auszusetzen ist.

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...."

noch_ein_hannes 20. Apr 2005 09:15

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:

also echt.... aber es ist schön, dass an dem restlichen code nichts auszusetzen ist.
Naja, nicht ganz:
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.
Seite 1 von 2  1 2      

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