AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Denkfehler mit Scanline?
Thema durchsuchen
Ansicht
Themen-Optionen

Denkfehler mit Scanline?

Ein Thema von Flips · begonnen am 31. Mär 2008 · letzter Beitrag vom 3. Apr 2008
Antwort Antwort
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#1

Denkfehler mit Scanline?

  Alt 31. Mär 2008, 22:50
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?
Miniaturansicht angehängter Grafiken
so_siehts_aus_117.png  
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 01:39
Welcher Teil des Bildes soll rot sein? Du zeigst uns ja nur, wie es nicht aussehen soll.
Was ist form3.netz.input?
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 08:03
die Zeile
    a := test^[w]; ist sinnlos, da Du ja 2 Zeilen weiter a wieder überschreibst!
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von defede
defede

Registriert seit: 10. Aug 2006
Ort: Stötten am Auerberg
72 Beiträge
 
Delphi 7 Professional
 
#4

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 09:44
Zitat von Kroko1999:
die Zeile
    a := test^[w]; ist sinnlos, da Du ja 2 Zeilen weiter a wieder überschreibst!
Denk ich nicht. Sieh mal was zurückgeschrieben wird.
Invader Zim
Obey Zim
Fear Zim
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#5

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 09:49
Denke ich doch.
Delphi-Quellcode:
a := test^[w];
b := test2^[w];
a := b;
Beia := test2^[w]; sollte das Gleiche herauskommen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von defede
defede

Registriert seit: 10. Aug 2006
Ort: Stötten am Auerberg
72 Beiträge
 
Delphi 7 Professional
 
#6

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 09:56
Sorry @ all.
War wohl ein KnickBit in der Optik.
Invader Zim
Obey Zim
Fear Zim
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 10:13
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?
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#8

Re: Denkfehler mit Scanline?

  Alt 1. Apr 2008, 12:31
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!
Philipp F.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#9

Re: Denkfehler mit Scanline?

  Alt 3. Apr 2008, 15:49
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.
Philipp F.
  Mit Zitat antworten Zitat
Flips

Registriert seit: 17. Feb 2005
Ort: Sankt Wendel
491 Beiträge
 
Delphi 7 Professional
 
#10

Re: Denkfehler mit Scanline?

  Alt 3. Apr 2008, 16:24
Juhu ich habs
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!
Philipp F.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 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