(Gelöst) Windows: Bitmaps Laden / Speichern
-
- 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
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
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.
-
- 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
Code: Alles auswählen
Stream:=TMemoryStream.Create;
//Speichern
TBitmap.SaveToStream(Stream);
//Laden
TBitmap.LoadFromStream(Stream);
//Über TImage:
TImage.Picture.Bitmap.SaveToStream(stream);
-
- 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
Servus!
Danke für den Ratschlag, aber:
funktioniert nicht.
Kompilieren geht, Programmausführung läuft, nur das Duplizieren des Bildes funktioniert halt auch nicht...
Gruß,
Adrian
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;
Kompilieren geht, Programmausführung läuft, nur das Duplizieren des Bildes funktioniert halt auch nicht...
Gruß,
Adrian
-
- 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
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;
-
- 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
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
-
- 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
Argh... da fehlt ein MyStream.Free...Adrian hat geschrieben:Servus!
Danke für den Ratschlag, aber:funktioniert nicht.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;
Kompilieren geht, Programmausführung läuft, nur das Duplizieren des Bildes funktioniert halt auch nicht...
Gruß,
Adrian
..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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
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
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
Woher auch immer: Stdin?
Ich würde gerne von STDIN das Bild laden.originalbild.LoadFromFile('/woher/auch/immer');
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.