AGB  ·  Datenschutz  ·  Impressum  







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

Fernsehrauschen zeichnen?

Ein Thema von StefanG · begonnen am 23. Mai 2006 · letzter Beitrag vom 23. Mai 2006
Antwort Antwort
Seite 3 von 3     123   
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#21

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 15:55
Delphi-Quellcode:
constructor Tsnow.Create(image: TImage);
begin
  FImage := image;
  inherited Create(False);
end;


procedure Tsnow.Execute;
begin
  while true do
    begin
      synchronize(setPixels);
    end;
end;

procedure Tsnow.SetPixels;
var
  r : Integer;
  x,y:Integer;
begin
  r := Random(256);
  x:=random(FImage.width);
  y:=random(FImage.height);

  FImage.Canvas.Pixels[x,y] := RGB(r,r,r)

end;

im Hauptprogramm:

var
  snow1,snow2 : TSnow;

begin
   snow1 := TSnow.create(image1);
   snow2 := TSnow.create(image1);
end;
und nicht vergessen, die Threads irgendwann zu beenden und freizugeben.

in Deinem Quellcode zeichnest Du zeilenweise Deine Punkt und nicht zufällig
auf das Image.

Mußt mal schauen, ob der obige Code geht habe ich nicht ausgetestet.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#22

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:02
Zitat von Klaus01:
[...]in Deinem Quellcode zeichnest Du zeilenweise Deine Punkt und nicht zufällig
auf das Image
Was ja nicht stört, da ein zufälliger Farbwert für jeden Punkt benutzt wird, was ebenfalls für ein Rauschen sorgt.
Manuel
  Mit Zitat antworten Zitat
StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#23

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:04
danke für den Tipp, klingt ja auch einleuchtend, aber irgendwas stimmt nicht.

Erst hab ich das Application.ProcessMessages nach unten gesetzt, was der Geschwindigkeit aber nichts gebracht hat,
beim ersten durchlauf konnte ich schön zugucken, wie das Weiss von Grauton-Punkten überzogen wird.

Dann hab ich die Zeile komplett rausgenommen. Jetzt geht der erste Durchgang so fix, dass ich die "Bewegung" nichtmehr sehen kann, d.h. ich starte das Programm und das image erscheint schon gefüllt mit Punkten.

Allerdings ist das nur beim ersten Durchlauf der Fall . Ich hab mal das Projekt angehängt. vielleicht guckt sich das mal jemand an, wenn er Zeit hat.
Angehängte Dateien
Dateityp: rar fernsehrauschen_639.rar (341,1 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
heiopei
(Gast)

n/a Beiträge
 
#24

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:06
hallo,
wäre es nicht besser, statt der direkten Zuweisung der Pixelfarbe

Img.Canvas.Pixels[i,j] := RGB(random(256),random(256),random(256)); die viel schnellere Variante mit Scanline zu verwenden?

wie man jetzt Scanline anwendet weiss ich auch nicht mehr so genau, aber man braucht nur noch eine Variable, welche die Zeile beschreibt und die Spalten werden durch erhöhen des Pointer bestimmt. d.h. man müsste nur noch einen Pointer zuwesein, der den Farbcode (bzw. schwarz oder weiss) enthält.

nur mal son gedanke,
mfg

heiopei
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#25

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:13
Könnte man schon, das fällt dann aber erstmal unter "Optimierungsmöglichkeiten"
Es ging ja erstmal primär ums "wie überhaupt".
Manuel
  Mit Zitat antworten Zitat
heiopei
(Gast)

n/a Beiträge
 
#26

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:22
aber das würde doch sein problem lösen, dass die anzeige so lange dauert, oder nicht?!?
  Mit Zitat antworten Zitat
StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#27

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:25
es muss doch aber woanders dran liegen, denn ohne thread geht das ganze 1000 mal schneller, als jetzt so

bei ner kleinen größe von z.b. 200x200 , wo ich einfach alle 10 ms durch nen Timer die Snow funktion aufgerufen habe, sieht das ganze sogar Original so aus wie im TV.....nur im Thread dauerts auf der gleichen Größe viel länger.
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#28

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:30
Ich schätze mal das Synchronize schluckt viel Zeit.
Ich glaube sogar, dass da immer das Image neugezeichnet wird.
Versuchs mal mit einem TBitmap im Thread, welches du nach dem komplette be-zeichnen
einfach auf das Image kopierst.
Manuel
  Mit Zitat antworten Zitat
StefanG

Registriert seit: 23. Feb 2006
74 Beiträge
 
#29

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:44
jau, das funktioniert um einiges schneller, vielen Dank.

Für den vollbildmodus auf 1280 x 1024 reicht dann wohl allgemein die Performance nicht. da kommt nach ner Zeit immer OutOfResources.
Aber wenn mans etwas kleiner macht, dann gehts ab wie schmidts Katze
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#30

Re: Fernsehrauschen zeichnen?

  Alt 23. Mai 2006, 16:53
wollte Euch mal meine Lösung zeigen, schreibt direkt auf die Form.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TSnow = class(TThread)
     private
       procedure setPixel;
     protected

       procedure execute; override;
     end;


var
  Form1: TForm1;
  snow1,snow2: TSnow;

implementation

{$R *.dfm}




procedure TSnow.setPixel;
var
  x,y : Integer;
  r,g,b: Byte;
begin
  x := random(Form1.Width);
  y := random(Form1.Height);
  r := random(256);
  g := random(256);
  b := random(256);
  Form1.Canvas.Pixels[x,y]:=RGB(r,g,b);
end;

procedure TSnow.execute;
begin
  while not terminated do
    begin
      synchronize(setPixel);
    end;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  snow1.Terminate;
  snow2.Terminate;
  snow1.Free;
  snow2.Free;
end;

begin
  randomize;
  snow1 := TSnow.create(false);
  snow2 := TSnow.Create(false);
end.
lustiger wird es wenn man nicht nur von einem Pixel die Farbe ändert
sonder von [x-1,y], [x,y], [x+1,y], [x,y-1], [x,y], [x,y+2]

Grüße
Klaus
Angehängte Dateien
Dateityp: exe psycho_327.exe (353,5 KB, 23x aufgerufen)
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 03:10 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