Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
10.09.2001, 17:48
Retro



Hollerö, ich hab da seit längerem nen Problem:

Ich hab schön öfters versucht das Bild aus einer TImage Komponente in einen FileStream mit anderen Variablen (Integer / String) zu speichern... leider will das nicht so richtig funktionieren.

Also hier erstmal der Sourcecode:Quellcode:unit Unit1;

interface

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

const
  STREAM_FILE = 'Stream.txt';

type
  // Bild-Record
  TDatensatz = record
    Text: string[50];
    Bild: TBitmap;
  end;
  // Formular
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Button5: TButton;
    OpenDialog1: TOpenDialog;
    Button4: TButton;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
    Daten: TDatensatz;
    procedure WriteInit;
    procedure ReadInit;
    procedure Write(filename: string);
    procedure Read(filename: string);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  if FileExists(STREAM_FILE) then
  begin
    Read(STREAM_FILE);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Write(STREAM_FILE);
end;

procedure TForm1.WriteInit;
begin
  with Daten do begin
    Text := Memo1.Lines.Text;
    Bild := Image1.Picture.Bitmap;
  end;
end;

procedure TForm1.ReadInit;
begin
  with Daten do begin
    Memo1.Lines.Text := Text;
    Image1.Picture.Bitmap := Bild;
  end;
end;

procedure TForm1.Write(filename: String);
var
  Stream: TFileStream;
begin
  WriteInit;
  Stream := TFileStream.Create(filename, fmCreate);
  Stream.Write(Daten, sizeof(TDatensatz));
  Stream.Free;
end;

procedure TForm1.Read(filename: String);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(filename, fmOpenRead);
  Stream.Read(Daten, sizeof(TDatensatz));
  ReadInit;
  Stream.Free;
end;

// Reset
procedure TForm1.Button5Click(Sender: TObject);
begin
  Image1.Picture := NIL;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Memo1.Lines.Text := '';
end;

// Bild laden
procedure TForm1.Button3Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Image1.Picture.LoadFromFile(OpenDialog1.FileName);
  end;
end;

end.

So, das ganze gibts auch als Zip: http://www.m249.de/imagestream.zip

Und die Funktionen der Programm sind ja sehr simpel - soll auch nur zum testen dienen. Nur wenn ich jetzt ein Bild lade, und nun den Stream speichere oder ihn wieder öffnen will, kommen Fehler. Der Text wird trotzdem geladen, aber das Bild nicht.
Wenn man sich die Stream.txt anguckt, steht dort auch nur der String drinne, vom Bild keine Spur.

Ich habe es schon mit TPicture / TBitmap / TImage / Bitmap ausprobiert, aber nichts davon bringt mich weiter...

Also entweder hab ich nen Brett vorm Kopf, oder es geht nicht (so einfach).

Tja, und das ist mein Problem, ich weis das TImage eine eigene Routine besitzt Quellcode:Image1.Picture.Bitmap.SaveToStream();
Aber dies ist ja für MemoryStreams...

=> Grr... alles nur unnütze C++ler hier, die verbrauchen nur Sauerstoff *fg* ;D

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */


Dieser Beitrag wurde am 10.09.2001 um 22:13 von Retro bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
11.09.2001, 21:47
Konrad



Ich weiss zwar nich was ein Stream is und was er bringt aber es sieht so aus als wolltest du ein Bitmap UND ein String in eine Datei speichern.
Hmm.
Unter Pascal konnte man noch records speichern (unter delphi auch)
aber da is ja ne klasse mit drin..
Schreib dir doch schnell ein eigenes Bitmap-Speicherverfahren.
Das ist doch auch cool. (und mit Paintbrush kannste die sowieso nich lesen)

[code]
TColoredPoint = record
x,y : Integer;
c : TColor;
end;
pixels = array[1..100,1..100] of TColoredPoint;
TStringPicture = record
p : pixels;
s : string;
end;
// so - ohne klassen - wie bei pascal - aaah!
[/code]

Die speicherfunktion bzw. ladefunktion schreibste halt mit Hilfe von Canvas.Pixels dann geht das.

--

eigentlich heisse ich [UHK]Hostage

zum Seitenanfang zum Seitenende Profil || Suche