Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Denkfehler mit Scanline? (https://www.delphipraxis.net/111230-denkfehler-mit-scanline.html)

Flips 31. Mär 2008 21:50


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:
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;
Der Code kopiert praktisch ein Bild auf ein anderes. Klar, dass geht eleganter. Es geht aber ums Prinzip.
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?

Dani 1. Apr 2008 00:39

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?

Kroko1999 1. Apr 2008 07:03

Re: Denkfehler mit Scanline?
 
die Zeile
Delphi-Quellcode:
    a := test^[w];
ist sinnlos, da Du ja 2 Zeilen weiter a wieder überschreibst!

defede 1. Apr 2008 08:44

Re: Denkfehler mit Scanline?
 
Zitat:

Zitat von Kroko1999
die Zeile
Delphi-Quellcode:
    a := test^[w];
ist sinnlos, da Du ja 2 Zeilen weiter a wieder überschreibst!

Denk ich nicht. Sieh mal was zurückgeschrieben wird.

DeddyH 1. Apr 2008 08:49

Re: Denkfehler mit Scanline?
 
Denke ich doch.
Delphi-Quellcode:
a := test^[w];
b := test2^[w];
a := b;
Bei
Delphi-Quellcode:
a := test2^[w];
sollte das Gleiche herauskommen.

defede 1. Apr 2008 08:56

Re: Denkfehler mit Scanline?
 
:drunken: Sorry @ all.
War wohl ein KnickBit in der Optik.

jfheins 1. Apr 2008 09:13

Re: Denkfehler mit Scanline?
 
Was machst du eigentlich mit diesem komischen Array?

Ich verwende Scanline bspw. so:
Delphi-Quellcode:
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;
Du musst in jedem Fall vorher das Format des Bitmaps setzen !
Bist du sicher, dass die Quelle auch 32bit ist?

Flips 1. Apr 2008 11:31

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!

Flips 3. Apr 2008 14:49

Re: Denkfehler mit Scanline?
 
Also ich verstehs echt nicht...
Habs jetzt mal wie jfheins gemacht:
Delphi-Quellcode:
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;
--> Selbes Ergebnis

Achso die Funktion, die mir das Bild captured sieht so aus, vielleicht bringt das ja was:
Codierung nennt sich I420.
Delphi-Quellcode:
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;
Es gibt noch ne RGB24 Codierung, allerdings weiß ich nicht was ich dazu in die Callback-Function schreiben muss.

Flips 3. Apr 2008 15:24

Re: Denkfehler mit Scanline?
 
Juhu ich habs :-D :dp:
Diesen Code der DP hab ich übernommen und das Pixelformat überall auf pf24Bit gestellt und den Codec RGB24 ausgewählt.
Jetzt funktionierts reibungslos!
Es geht sogar mit dem I420 Codec!!!

Danke euch allen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz