(Gelöst) Windows: Bitmaps Laden / Speichern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Adrian
Beiträge: 31
Registriert: Mo 12. Nov 2007, 12:41
OS, Lazarus, FPC: Winux (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit

(Gelöst) Windows: Bitmaps Laden / Speichern

Beitrag von Adrian »

Servus!

Lazarus 0.9.27 / WindowsXP
Ich habe in einem TImage eine Bitmap. Beim Programmstart speichere ich diese mittels "SaveToFile" ab, da ich sie im weiteren Verlauf noch mehrmals wieder im Urzustand brauche, wozu ich sie mir mit "LoadToFile" wieder lade.
Abhängig von Bitmap-Größe und Leistungsfähigkeit des PCs kommen da unangenehme Verzögerungen zustande (das Programm verwende nicht nur ich, sondern auch Vereinskollegen, die nicht unbedingt allzu große Erfahrungen mit PCs haben). Nun habe ich mir überlegt, wie das beschleunigt werden kann, und auch Versuche mit "SaveToClipboardFormat" und "SaveToStreamWithFileExt" angestellt, allerdings ohne Erfolg. Die Clipboard-Variante möchte ich ungern nutzen, da ich nicht sicherstellen kann, daß die Zwischenablage nicht überschrieben wird. Zur Stream-Variante finde ich leider so gut wie gar keine Beispiele, so daß ich nache einigen Versuchen nicht weitergekommen bin.
Was würdet ihr für mein Problem vorschlagen (mir fällt nichts weiter ein) und wo finde ich Hinweise zur Stream-Variante?

Gruß,

Adrian
Zuletzt geändert von Adrian am Di 26. Mai 2009, 08:04, insgesamt 1-mal geändert.

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Windows: Bitmaps Laden / Speichern

Beitrag von _X_ »

Code: Alles auswählen

Stream:=TMemoryStream.Create;
 
//Speichern
TBitmap.SaveToStream(Stream);
 
//Laden
TBitmap.LoadFromStream(Stream);
 
//Über TImage:
TImage.Picture.Bitmap.SaveToStream(stream);
mfg _X_

Adrian
Beiträge: 31
Registriert: Mo 12. Nov 2007, 12:41
OS, Lazarus, FPC: Winux (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit

Re: Windows: Bitmaps Laden / Speichern

Beitrag von Adrian »

Servus!

Danke für den Ratschlag, aber:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  MyStream : TMemoryStream;
begin
  MyStream := TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(MyStream);
  Application.ProcessMessages;
  Image2.Picture.Bitmap.LoadFromStream(MyStream);
  Application.ProcessMessages;
end;
funktioniert nicht.
Kompilieren geht, Programmausführung läuft, nur das Duplizieren des Bildes funktioniert halt auch nicht...

Gruß,

Adrian

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Windows: Bitmaps Laden / Speichern

Beitrag von Scotty »

Wieso speicherst Du das Bild nicht in einer extra Variable?

Code: Alles auswählen

type 
  TForm1
  ...
    procedure FormShow()
  private
    FOriginalImage : TImage;
  public
  end;
 
procedure TForm1.FormShow();
begin
  FOriginalImage:=TImage.Create;
  usw.
end;

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Windows: Bitmaps Laden / Speichern

Beitrag von monta »

Unabhängig davon, muss man nicht noch nach dem Laden die größe des Bitmaps manuell setzen, da es sonst keine hat und somit auvh nichts angezeigt wird, bspw. wenn du es aus dem Stream liest?
Johannes

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Windows: Bitmaps Laden / Speichern

Beitrag von Socke »

Adrian hat geschrieben:Servus!

Danke für den Ratschlag, aber:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  MyStream : TMemoryStream;
begin
  MyStream := TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(MyStream);
  Application.ProcessMessages;
  Image2.Picture.Bitmap.LoadFromStream(MyStream);
  Application.ProcessMessages;
end;
funktioniert nicht.
Kompilieren geht, Programmausführung läuft, nur das Duplizieren des Bildes funktioniert halt auch nicht...

Gruß,

Adrian
Argh... da fehlt ein MyStream.Free...
..aber Scotty hat auch recht, nur ist TImage zur Speicherung eines Bildes nicht notwendig, eine ganz normale TGraphic-Klasse reicht aus (oder eben TPicture):

Code: Alles auswählen

type
  tfrm = clas(TForm)
  private
    bild1: TImage;
    originalbild: TBitmap; // wenn mehr als ein Format verwendet werden können soll, ist wohl TPicture besser
  end;
 
// erst alles erstellen
bild1 := TImage.Create(Self);
originalbild := Tbitmpa.Create;  // muss später wieder freigegeben werden
originalbild.LoadFromFile('/woher/auch/immer');
 
// und zum Laden
bild1.Picture.Bitmap.Assign(originalbild);
Mfg Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Adrian
Beiträge: 31
Registriert: Mo 12. Nov 2007, 12:41
OS, Lazarus, FPC: Winux (L 2.0.6 FPC 3.0.4)
CPU-Target: 64Bit

Re: Windows: Bitmaps Laden / Speichern

Beitrag von Adrian »

Servus!

Da hab ich mich so in meine Stream-Theorie verrannt, daß ich die Möglichkeit, das Bild als Variable zu speichern, einfach nicht mehr bedacht habe. Manchmal sieht man wirklich den Wald vor lauter Bäumen nicht mehr.
Ja, MyStream.Free hab ich im Beispiel vergessen. Beim Original-Programm wirds in einer anderen Prozedur aufgerufen.
Danke für die Hilfe!

Gruß,

Adrian

gerdi
Beiträge: 24
Registriert: Mo 9. Nov 2009, 19:41

Woher auch immer: Stdin?

Beitrag von gerdi »

originalbild.LoadFromFile('/woher/auch/immer');
Ich würde gerne von STDIN das Bild laden.
Geht das auch?

Mein Hintergedanke:
Meine debian-eeepc-onboard-kamera spielt über mplayer ab.

Mplayer kann screenshots auf STDOUT senden.

Ich könnte also (wie auch immer?) das Lazarus-Programm veranlassen mplayer zu starten und einen Screenshot auf STDOUT zu senden. Den Screenshot könnte ich von Lazarus auswerten. So könnte ich in Lazarus die Bilder von der onboard-kamera verarbeiten.

Antworten