| Autor |
Beitrag |
RedBaron2k7
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Mo 16.04.07 23:10
Kann mir schnell mal jemand weiterhelfen?
Delphi-Quelltext 1:
| type ByteArray = Array of Byte; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var temp_bitmap: TBitmap; temp_data: ByteArray; p: pByte; w: Integer; h: Integer; i, i2, c: Integer; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| p := temp_bitmap.Scanline[0]; for i := 0 to 3*(w-1)*(h-1) do begin temp_data[i] := p; Inc(Integer(p), 1); end; |
Der Fehler liegt in der rot markierten Zeile ...
* p ist der byte-Pointer
* temp_data ist ein Byte-Array
Wie bekomm ich Daten die am Pointer liegen in das Array?
Thx 4 ur help 
|
|
ConditionZero
      
Beiträge: 190
Win XP
Delphi 7 PE, C++ (Dev-C++), HTML+PHP (Dreamweaver MX), JavaScript(MS FrontPage)
|
Verfasst: Mo 16.04.07 23:11
Welche rote Zeile 
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Mo 16.04.07 23:12
die da ^^
color ging ne ^^
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 16.04.07 23:12
Ganze schnelle Hilfe: SCANLINES 
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 16.04.07 23:19
Nimm ein Type PByteArray = ^TByteArray; mit der Definition Type TByteArray = Array[0..] of Byte; und weise dieses mit P := BMP.ScanLine[0] zu. Index-Zugriff dann wie gewohnt, jedoch mit Dereferenzierung auf P^[i], um dem Zeiger Rechnung zu tragen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Di 17.04.07 00:01
BenBE hat folgendes geschrieben: | | Nimm ein Type PByteArray = ^TByteArray; mit der Definition Type TByteArray = Array[0..] of Byte; und weise dieses mit P := BMP.ScanLine[0] zu. Index-Zugriff dann wie gewohnt, jedoch mit Dereferenzierung auf P^[i], um dem Zeiger Rechnung zu tragen. |
Ich möche jedoch nureine Schleifverwenden, und mit dieser Byte-weise in mein Array kopieren .... das ganze steht ja schon .... nur irgendwas stimmt mit dem Pointer net ... also demwas ich oben markiert habe .... das muss doch auch so gehen...
wäre schön wenn sich das so lösen lässt ...
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Di 17.04.07 00:03
weitere Frage gleich noch ....
Delphi-Quelltext
brauch ich da das Integer() ???
Kenne mich mit Pointern noch nicht so gut aus ^^
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 17.04.07 00:13
Nein, das Integer brauchst Du nicht. Du solltest Dir aber bewusst sein, dass Inc(p); und Inc(p^); zwei völlig unterschiedliche Dinge sind ...
Zu deiner Schleifenvariable: Es hat einen guten Grund, warum ich Dir den Weg mit dem Array empfehle ... 1. Sauberer, 2. Intuitiver zu verwenden, 3. Gebräuchlicher...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Di 17.04.07 00:16
BenBE hat folgendes geschrieben: | Nein, das Integer brauchst Du nicht. Du solltest Dir aber bewusst sein, dass Inc(p); und Inc(p^); zwei völlig unterschiedliche Dinge sind ...
Zu deiner Schleifenvariable: Es hat einen guten Grund, warum ich Dir den Weg mit dem Array empfehle ... 1. Sauberer, 2. Intuitiver zu verwenden, 3. Gebräuchlicher... |
jop ... inc(p) geht zur nächsten speicheraddresse
und inc(p^) erhöht den wert an der speicheraddresse soweit ich weiss ???
na, ich überdenke das ganze nochmal ... wie sieht es mit den TRGBQuads oder wie die heißen aus der windows.pas aus?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 17.04.07 00:29
Kann man alternativ zu Byte verwenden. Beachte dann aber, für welches Pixel-Format Du das verwendest ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Di 17.04.07 01:41
BenBE hat folgendes geschrieben: | | Kann man alternativ zu Byte verwenden. Beachte dann aber, für welches Pixel-Format Du das verwendest ... |
So... habe das ganze nun in das "Format" mit den ByteArrays gebracht ...
Jedoch hängts nun an dieser Zeile ...
Wie komme ich in die nächste ScanLine? Ohne dabei den Befehl ScanLine() selbst aufzurufen...
Theoretisch ja Addresse von "p" + Größe von einer Zeile (ScanLine)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| p := temp_bitmap.Scanline[0]; for i := 0 to (h - 1) do begin SetLength(temp_data[i], 3*w); for j := 0 to (3*w - 1) do begin temp_data[i][j] := p^[j]; end;
Inc(p, 1); end; |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 17.04.07 01:44
Genau eben nicht. Du musst es mit Scanline machen, weil Bitmaps intern Bottom-Up gespeichert sind ... Wie die Adressberechnung genau funktioniert, steht in den VCL-Units. Grob gesagt aber: Rundung auf 4-Byte-Adresse nach Ende der vorigen Zeile.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Di 17.04.07 01:58
|
|
RedBaron2k7 
      
Beiträge: 25
SuSE Linux, Windows XP
BDS06
|
Verfasst: Di 17.04.07 03:09
So ... hier nun meine Lösung ...
Werde das Thema als "gelöst markieren"^^
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| p := temp_bitmap.Scanline[0]; ds := Integer(temp_bitmap.Scanline[1]) - Integer(p);
for i := 0 to (h - 1) do begin SetLength(temp_data[i], 3*w); for j := 0 to (3*w - 1) do begin temp_data[i][j] := p^[j]; end;
Inc(Integer(p), ds); end; |
|
|