Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap erstellen mit TBitmap.Create und speichern (https://www.delphipraxis.net/97606-bitmap-erstellen-mit-tbitmap-create-und-speichern.html)

Alex_ITA01 13. Aug 2007 14:23


Bitmap erstellen mit TBitmap.Create und speichern
 
Hallo zusammen,
mit folgendem Source erstelle ich ein Bitmap und speicher dieses ab.

Delphi-Quellcode:
Bmp       := TBitmap.Create;
Bmp.Width := 1024;
Bmp.Height := 768;
Bmp.Pixelformat := pf32bit;

for i := 0 to 5 do
begin
  for j := 0 to 5 do
  begin
    Bmp.Canvas.Pixels[i,j] := 0;
  end;
end;

Bmp.SaveToFile('C:\Test.bmp');
Das funktioniert und die Datei ist 3MB groß.
Aber wieso funktioniert folgendes nicht?

Delphi-Quellcode:
Bmp       := TBitmap.Create;
Bmp.Width := 1024;
Bmp.Height := 768;
Bmp.Pixelformat := pf32bit;

for i := 0 to 300 do
begin
  for j := 0 to 300 do
  begin
    Bmp.Canvas.Pixels[i,j] := 0;
  end;
end;

Bmp.SaveToFile('C:\Test.bmp');
Er speichert mir zwar eine Datei auf C aber die ist 0k groß.
Ich habe nur die Schleifenvariablen erhöht.
Wisst ihr was das sein kann?
MFG Alex

mkinzler 13. Aug 2007 14:27

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Welche Typen haben i und j?

Alex_ITA01 13. Aug 2007 14:29

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
beides Integer. Normale Schleifenvariablen...

Alex_ITA01 13. Aug 2007 14:33

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe es gerade mal mit 100 getestet (anstatt 300) und da gehts auch noch allerdings ist das Bild nicht wie erwartet ein konstant gefülltes schwarzes Quadrat sondern hat auch ein paar weiße Lücken drinne... Siehe Screenshot (nur ein Ausschnitt aus der gesamten Bilddatei)

Alex_ITA01 13. Aug 2007 14:36

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Habe es jetzt mal in einer Testanwendung programmiert, da geht es wunderbar.
Es funktioniert anscheind nur nicht, wenn ich es in einem Thread laufen lasse, der mit den Indy's über TCP komuniziert...
Könnte es an soetwas liegen?

MFG Alex

Alex_ITA01 13. Aug 2007 14:41

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
nur zur Ergänzung:
Die weißen Balken sind immer an verschiedenen Stellen obwohl ich nix am Quelltext ändere...
ich verstehe das nicht?!

MFG Alex

mkinzler 13. Aug 2007 14:48

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Und wenn du die Daten im Thread irgendwo zwischenspeicherst?

Alex_ITA01 13. Aug 2007 14:51

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Ich habe im Thread jetzt schon eine neue Procedure geschrieben mit dem Namen CreateNewBitmap;

Wenn ich darin folgenden Source verwende, dann hab ich mal weiße Balken da, mal da und mal da...

Delphi-Quellcode:
procedure CreateNewBitmap;
var
  Bmp : TBitmap;
  i, j : Integer;
begin
  Bmp       := TBitmap.Create;
  Bmp.Width := 1024;
  Bmp.Height := 768;
  Bmp.Pixelformat := pf32bit;

  for i := 0 to 1023 do
  begin
    for j := 0 to 767 do
    begin
      Bmp.Canvas.Pixels[i,j] := 0;
    end;
  end;

  Bmp.SaveToFile('C:\Test.bmp');
end;
Ich verstehe es einfach nicht...
MFG Alex

Martin K 13. Aug 2007 15:02

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Und wenn du das schwarze Quadrat einfach mal mit FillRect() füllst, anstatt jedes Pixel einzeln zu zeichnen?
(Farbe setzt du vorher mit Brush.Color)

mkinzler 13. Aug 2007 15:05

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Das mit der 0 ist wohl nur ein Test. Er hat wohl vor Bilddaten per INDY zu versenden

Alex_ITA01 13. Aug 2007 15:17

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
ja genau so habe ich es vor.
0 ist nur ein Test.

Kann ich denn irgendwas mit Scanline anfangen oder eine andere Methode, wo ich ein Bitmap erstellen kann, einzelne Pixel ändere und das dann abspeichere?!

MFG Alex

mkinzler 13. Aug 2007 15:32

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Hast du das mit dem Zwischenspeichern mal versucht?

Alex_ITA01 13. Aug 2007 15:38

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
wie meinst du das mit dem zwischenspeichern?
Ich versuche es gerade über einen Stream zu machen,mal gucken was dabei raus kommt?!
MFG Alex

Alex_ITA01 13. Aug 2007 15:39

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
mit einem Stream habe ich das gleiche Problem, dass ab und zu weiße balken da sind...
Kennst du noch andere methoden, die ich nutzen könnte.
danke alex

mein neuer source für stream:

Delphi-Quellcode:
procedure CreateNewBitmap;
var
  Bmp : TBitmap;
  i, j : Integer;
  aStream : TFileStream;
begin
  Bmp       := TBitmap.Create;
  Bmp.Width := 1024;
  Bmp.Height := 768;
  Bmp.Pixelformat := pf32bit;

  for i := 0 to 1023 do
  begin
    for j := 0 to 767 do
    begin
      Bmp.Canvas.Pixels[i,j] := clBlack;
    end;
  end;

  aStream := TFileStream.Create('C:\Test.bmp', fmCreate or fmOpenWrite);
  Bmp.SaveToStream(aStream);
  aStream.Free;
end;
[edit]

Es geht auch mit MemoryStream anstatt FileStream nicht

[/edit]

mkinzler 13. Aug 2007 15:44

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Mit Zwischenspeichern meine ich es in einen Puffer abzulegen und dann im Haupthread das Bitmap zu erzeugen.

Alex_ITA01 13. Aug 2007 15:46

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
ich bekomme relativ schnell diese bilder hintereinander (bzw. immerwieder neue Bilder).
meinst du mit zwischenspeichern in ein zweites array?
mfg alex

Diese Funktion CreateNewBitmap soll also woanders aufgerufen werden?

Alex_ITA01 13. Aug 2007 15:51

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
ich habe jetzt aus dem Thread ein timer auf einem formular unsynchroniziert enabled auf true gesetzt und dieser timer speichert jetzt das bild in seinem event.
da scheint es erstmal zu gehen. werde es aber noch ein paar mal testen. ich verlasse mich so schnell auf nichts mehr :-)

Trotzdem verstehe ich das nicht, warum es im thread nicht geht. Vielleicht weiß noch jemand warum oder hat eine lösung.

Danke alex

mkinzler 13. Aug 2007 15:56

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Die VCL ist (noch) nicht multithreading-fähig!

Alex_ITA01 13. Aug 2007 15:59

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
aber wieso geht es in einem thread nicht? das heißt, die speichern funktion von TBitmap ist nicht threadsicher?

MFG Alex

mkinzler 13. Aug 2007 16:03

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Ja.

Alex_ITA01 14. Aug 2007 07:06

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
ok, danke für deine Hilfe.

MFG Alex

SirThornberry 14. Aug 2007 07:33

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
also wenn ich mir den Quelltext (BDS2006) anschaue ist da nichts was in Threads nicht funktionieren sollte. Funktioniert das ganze in einem leeren Projekt wo du nur einen Thread hast der dir das Bitmap speichert?

Alex_ITA01 14. Aug 2007 07:36

Re: Bitmap erstellen mit TBitmap.Create und speichern
 
Das habe ich noch nicht getestet aber es deutet bisher alles darauf hin, dass es nicht threadsicher ist. du siehst ja in einem screenshot weiter oben von mir, dass ab und zu auf beliebigen Punkten weiße Balken zu sehen sind. Mache ich das über ein Formular gehts...

Naja, ich lasse es jetzt erstmal so auch wenn es mich nicht ganz glücklich macht :-)

MFG Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 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