Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Fernsehrauschen zeichnen? (https://www.delphipraxis.net/69987-fernsehrauschen-zeichnen.html)

StefanG 23. Mai 2006 09:14


Fernsehrauschen zeichnen?
 
Hi,

kann mir jemand sagen, wie man den "TV - Schnee" selber machen kann?
Damit meine ich das Bild, was ein Fernseher anzeigt, wenn man keinen Empfang hat. Also einfach ne Menge von weißen/schwarzen Punkten, die ständig die Position ändern

Beispiel

RavenIV 23. Mai 2006 09:28

Re: Fernsehrauschen zeichnen?
 
Also wenn mein TV keinen Empfang hat, dann zeigt er ein blaues Bild an. :???:

H4ndy 23. Mai 2006 09:35

Re: Fernsehrauschen zeichnen?
 
Zitat:

Zitat von RavenIV
Also wenn mein TV keinen Empfang hat, dann zeigt er ein blaues Bild an. :???:

Sehr produktiver Beitrag ;)

Also Ich würde einfach die Zeichenfläche Pixel für Pixel durchlaufen und einen zufälligen Grauwert dort zeichnen.
Delphi-Quellcode:
...
Randomize; // *einmalig* im Programm aufrufen, z.B. im FormCreate
...
// Hilfsfunktion
function RGBToColor(R, G, B : byte): TColor;
begin
  Result := ((R and $FF) shl 16) +
    ((G and $FF) shl 8) + (B and $FF);
end;
...
// Zufälligen Grauwert erzeugen
var Farbe: TColor;
    r,g,b: integer;
begin
  r := Random(256);
  g := r;
  b := r;

Farbe := RGBToColor(r,g,b);

Pinki 23. Mai 2006 09:43

Re: Fernsehrauschen zeichnen?
 
Setze den Bildschirmbereich fest z.b. 200 X 200
[delphi]Procedure Randomize;
begin
end;
dann packst du in deiner procedure BkColor erstmal auf Black und dann
for i:=1 to beliebig do //(je mehr desto mehr Schnee)
Image1.Canvas.Pixels[(Random(200),Random(200)]:=clWhite
end;



Viel Spass :bounce1:

Klaus01 23. Mai 2006 09:49

Re: Fernsehrauschen zeichnen?
 
@Pinki
- randomize solltest Du die Prozedur nicht nennen, die Funktion gibt es schon.

Grüße
Klaus

StefanG 23. Mai 2006 09:55

Re: Fernsehrauschen zeichnen?
 
danke schonmal, das "Bild" bekomme ich nun hin, aber es sollte sich auch ständig bewegen...wie beim tv halt

hab versucht, einfach aus dem FOR nen while true do zu machen, aber da wird die form garnicht erst angezeigt.

H4ndy 23. Mai 2006 09:56

Re: Fernsehrauschen zeichnen?
 
Zitat:

Zitat von Klaus01
@Pinki
- randomize solltest Du die Prozedur nicht nennen, die Funktion gibt es schon.

Was man in meinem Quellcode direkt mal bewundern kann ;)

@Pinki: Ich feinde deine Version nicht ganz so toll, da dabei viele Freiräume entstehen können.
Außerdem machst du nur Schwarz-Weiss-Gekriesel, welches zusätzlich noch irgendwann alles Weiss gefärbt hat.

@Stefan: Pack den Quellcode - meinen oder Pinkis - in einen Timer.
(Sollte es nicht neu gezeichnet werden, einfach noch ein Application.ProcessMessages; anhängen)

Klaus01 23. Mai 2006 10:00

Re: Fernsehrauschen zeichnen?
 
um das alles etwas echter aussehen zu lassen,
kannst Du Dir mal überlegen, das Malen von dem
Schnee in mehrer Threads auszulagern.

Wenn ein weißer Punkt gemalt wurde, muss er
nach eniger Zeit auch wieder entfernt werden.
Ansonsten hast Du nach einer gewissen Zeit Dein Bild weiß.

zum while true do

in der Schleife solltest Du noch application.processMessages einbringen
und vielleicht noch ein delay() von einigen millisekunden.

delay findest Du in der Codelib.

Grüße
Klaus

pacman1986 23. Mai 2006 10:04

Re: Fernsehrauschen zeichnen?
 
@ Handy dein RGBtoColor gibts Schon

Delphi-Quellcode:
Color := RGB(R,G,B);


Delphi-Quellcode:

randomize; //Wie oben schon gesagt einmal aufrufen
...
procedure Schnee(Img : TImage);
var i,j:integer;
begin
   For i := 1 to Img.Width do
     For j := 1 to Img.height do begin
         Img.Canvas.Pixels[i,j] := RGB(random(256),random(256),random(256));
         application.ProcessMessages
     end;
end;
Aufruf dann
Delphi-Quellcode:
Schnee(Image1);

H4ndy 23. Mai 2006 10:08

Re: Fernsehrauschen zeichnen?
 
Zitat:

Zitat von Klaus01
um das alles etwas echter aussehen zu lassen,
kannst Du Dir mal überlegen, das Malen von dem
Schnee in mehrer Threads auszulagern.
[...]
in der Schleife solltest Du noch application.processMessages einbringen
und vielleicht noch ein delay() von einigen millisekunden.

Ich glaub Delay ist da überflüssig, da das Bildrauschen meist sehr schnell ist.
Threads sind glaub ich auch direkt mal Spatzen mit Kanonen abschießen ;)
Höstens einer würde hier passen, damit das Hauptprogramm nicht vom Zeichenvorgang
ausgebremst wird.

@pacman1986:
Ich glaub ich hatte RGB() schonmal benutzt, war mir aber nicht mehr sicher.
Deshalb hab ich fix mal einen Ersatz dafür gesucht ^^

Aso: Du erzeugst übrigends bunten Schnee ;)
Du musst für RGB dreimal den selben Wert benutzen, damit ein Grauwert entsteht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr.
Seite 1 von 3  1 23      

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