![]() |
Denkfehler mit Scanline?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi.
Erstmal tschuldigung für die schlechte Überschrift, wenn das Thema gelöst wird dann ändere ich sie eventuell. Aber nun zum Problem, geht um folgenden Code:
Delphi-Quellcode:
Der Code kopiert praktisch ein Bild auf ein anderes. Klar, dass geht eleganter. Es geht aber ums Prinzip.
type TRGBArray = array [0..100000000] of RGBQUAD;
PRGBARRAY = ^TRGBArray; var a,b: RGBQUAD; h,w: Integer; test,test2 : PRGBARRAY; for h := 0 to 240 - 1 do begin test := form2.Image1.picture.bitmap.ScanLine[h]; test2 := form3.imgBuffer.Picture.Bitmap.ScanLine[h]; for w := 0 to 320 - 1 do begin a := test^[w]; b := test2^[w]; a := b; if form3.netz.input[(h*320)+w].nettoinput <> 0 then a.rgbRed := $FF; test^[w] := a; end; end; form2.image1.Invalidate; Zusätzlich zum kopieren wird jeder Pixel je nach Arrayeintrag gefärbt. Allerdings kommt dann sowas wie im Anhang raus. Pixelformat vom Zielbild ist 32 Bit, die Quelle ist via Callback über die Webcam gecaptured. Weiß jemand, was ich falsch mache? Wieso funktioniert das eigentliche kopieren, nur das Rot machen geht nicht? Achso, je weiter ich den Stift nach links bewege, desto mehr deckt sich der rote Bereich mit dem Stift o_O DANKE, lg Flips Ps: Das geht glaub auch mit einer Schleife, hat jemand den passenden Code mit einer Schleife? |
Re: Denkfehler mit Scanline?
Welcher Teil des Bildes soll rot sein? Du zeigst uns ja nur, wie es nicht aussehen soll.
Was ist form3.netz.input? |
Re: Denkfehler mit Scanline?
die Zeile
Delphi-Quellcode:
ist sinnlos, da Du ja 2 Zeilen weiter a wieder überschreibst!
a := test^[w];
|
Re: Denkfehler mit Scanline?
Zitat:
|
Re: Denkfehler mit Scanline?
Denke ich doch.
Delphi-Quellcode:
Bei
a := test^[w];
b := test2^[w]; a := b;
Delphi-Quellcode:
sollte das Gleiche herauskommen.
a := test2^[w];
|
Re: Denkfehler mit Scanline?
:drunken: Sorry @ all.
War wohl ein KnickBit in der Optik. |
Re: Denkfehler mit Scanline?
Was machst du eigentlich mit diesem komischen Array?
Ich verwende Scanline bspw. so:
Delphi-Quellcode:
Du musst in jedem Fall vorher das Format des Bitmaps setzen !
var
Pixel: ^TRGBTriple; begin // ... for i := 0 to Bild.Height - 1 do begin Pixel := Bild.ScanLine[i]; for j := 0 to Bild.Width - 1 do begin if (Pixel^.rgbtRed = 0) then begin Pixel^.rgbtRed := 0; end; Inc(Pixel); end; end; Bist du sicher, dass die Quelle auch 32bit ist? |
Re: Denkfehler mit Scanline?
Das Array namens input ist ein statisches Array gefüllt mit einem Record, Nettoinput ist ein Integerwert und kann 0 oder nicht 0 sein.
Wenn er nicht 0 ist, dann soll der Pixel an der Stelle rot werden. Also ich meine das Quellbild ist 24Bit, fällt mir gerade ein^^ Dann stell ich mal das Zielbild auch auf 24Bit und nutze wieder RGBTriple. Melde mich dann! |
Re: Denkfehler mit Scanline?
Also ich verstehs echt nicht...
Habs jetzt mal wie jfheins gemacht:
Delphi-Quellcode:
--> Selbes Ergebnis
form2.Image1.Picture.Bitmap.PixelFormat := APixelFormat; //-> pf32Bit
for h := 0 to 240 - 1 do begin a := form2.Image1.picture.bitmap.ScanLine[h]; b := form3.imgBuffer.Picture.Bitmap.ScanLine[h]; for w := 0 to 320 - 1 do begin a^ := b^; if form3.netz.input[(h*320)+w].nettoinput <> 0 then a^.rgbRed := $FF; inc(a); inc(b); end; end; Achso die Funktion, die mir das Bild captured sieht so aus, vielleicht bringt das ja was: Codierung nennt sich I420.
Delphi-Quellcode:
Es gibt noch ne RGB24 Codierung, allerdings weiß ich nicht was ich dazu in die Callback-Function schreiben muss.
function FrameCallbackFunction(AHandle : hWnd; VIDEOHDR : TVideoHDRPtr): bool; stdcall;
var I : integer; BitmapInfo: TBitmapInfo; begin result := true; if not grab then Exit; FillChar(BitmapInfo, SizeOf(BitmapInfo), 0); SendMessage(capHandle, WM_CAP_GET_VIDEOFORMAT, SizeOf(BitmapInfo), Integer(@BitmapInfo)); ConvertCodecToRGB(BICompressionToVideoCodec(bitmapinfo.bmiHeader.biCompression), VideoHDR^.lpData, @Buf2,320, 240); for I := 1 to 240 do Buf1[I] := Buf2[240 -(I-1)]; SetBitmapBits(bmpBuffer.Handle,320*240*SizeOf(DWord),@Buf1); grab := false; end; |
Re: Denkfehler mit Scanline?
Juhu ich habs :-D :dp:
![]() Jetzt funktionierts reibungslos! Es geht sogar mit dem I420 Codec!!! Danke euch allen! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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