Entwickler-Ecke

Dateizugriff - Bilder laden/speichern


BM_90 - Fr 14.12.07 16:02
Titel: Bilder laden/speichern
Ich muss mehrere Bilder auf einmal in mehreren TIimages öffnen, hab aber keine Ahnung, wie das geht...
außerdem muss ich bei den Bildern die Größe anpassen...

das ist der Quelltext den ich dazu jetzt schon hab, kann mir jemand verraten, in wie fern ich den umschreiben muss??

laden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.AusDatei1Click(Sender: TObject);
begin
  if not list.execute then
  exit;
  image1.Picture.LoadFromFile(list.FileName);
end;


speichern:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Exportieren1Click(Sender: TObject);
begin
  if not savepicturedialog1.execute then
  exit;
  image1.Picture.Graphic.savetoFile(list.FileName);
end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


mister_x - Fr 14.12.07 18:20

so kannst du die bilder laden


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
var
  Images  : Array[0..100]of TImage;
  ImagesCount : Integer=0;

procedure TForm1.BitBtn1Click(Sender: TObject);
var I : Integer;
begin
  if OpenDialog.Execute then
    begin
      for I:=0 to OpenDialog.Files.Count-1 do
        if I<100 then
          begin
            Images[I] :=  TImage.Create(Self);
            Images[I].Parent  :=  Form1;
            Images[I].Left    :=  (I mod 10)*(Width div 10);
            Images[I].Width   :=  Width div 10;
            Images[I].Height  :=  Height div 10;
            Images[I].Top     :=  Trunc(I/10)*(Width div 10);

            Images[I].Stretch :=  true;
            Images[I].Proportional :=  true;

            Images[I].Picture.LoadFromFile(OpenDialog.Files.Strings[I]);

            Inc(ImagesCount);
          end;
    end;
end;


beim speichern kommts drauf an wie dus speichern willst generell


Delphi-Quelltext
1:
2:
3:
4:
for I:=0 to ImagesCount-1 do
begin
Images[I].Picture.SaveToFile(Verzeichnis+'Bild['+inttostr(I)+'].bmp');
end;


Mister_X


BM_90 - Mo 17.12.07 15:05

Vieln dank für deine hilfe. warn zwar n paar kleine fehler drin, aber naja...
hab jetz im griff. hab mir das so umgefummelt, dass ich mit nem savepicturedialog in nem beliebign verzeichnis speichern kannst. hab nur noch das problem, dass ich dass nich immer mit speichern unter.. machn will. will dass der die automatisch unter nem vorher per edit eingegebenen namen mit durchnummerierung die datein in nem bestimmtn verzeichnis speichert. hab außerdem noch das problem, dass ich im savepicturedialog immer nur eine datei markiern kann. wie kann ich das ändern?

kannste mir da vllt nochmal hefn??


Martin1966 - Mo 17.12.07 17:07

user profile iconBM_90 hat folgendes geschrieben:
will dass der die automatisch unter nem vorher per edit eingegebenen namen mit durchnummerierung die datein in nem bestimmtn verzeichnis speichert.

Wo genau liegt das Problem?

user profile iconBM_90 hat folgendes geschrieben:
hab außerdem noch das problem, dass ich im savepicturedialog immer nur eine datei markiern kann. wie kann ich das ändern?

Aus welchem Grund sollte man mehrere Dateinamen über den TSavePictureDialog festlegen können?

Lg, Martin

PS: Du solltest dir etwas mehr Mühe beim schreiben deiner Nachrichten geben... die sind nämlich sehr schwer zu lesen!


mister_x - Mo 17.12.07 17:25

user profile iconBM_90 hat folgendes geschrieben:
Vieln dank für deine hilfe. warn zwar n paar kleine fehler drin, aber naja...
hab jetz im griff. hab mir das so umgefummelt, dass ich mit nem savepicturedialog in nem beliebign verzeichnis speichern kannst. hab nur noch das problem, dass ich dass nich immer mit speichern unter.. machn will. will dass der die automatisch unter nem vorher per edit eingegebenen namen mit durchnummerierung die datein in nem bestimmtn verzeichnis speichert. hab außerdem noch das problem, dass ich im savepicturedialog immer nur eine datei markiern kann. wie kann ich das ändern?

kannste mir da vllt nochmal hefn??


wo warn da fehler drin???
ich hab doch oben geschrieben wie du speichern kannst wo ist da dein problem???
un bei deiner anderen frage schließ ich mich ma Martin 1966 an


BM_90 - Mo 17.12.07 17:33

naja, ich will halt mehrere bilder auf einmal öffnen...

un wegen der fehler: beim kopieren von dem quelltext, hat der son [color] mit reingemacht, natürlich hat sich delphi deswegen beim compilieren beschwert.
und ich wundere mich... schön blöd


mister_x - Mo 17.12.07 17:36

user profile iconBM_90 hat folgendes geschrieben:
naja, ich will halt mehrere bilder auf einmal öffnen...

un wegen der fehler: beim kopieren von dem quelltext, hat der son [color] mit reingemacht, natürlich hat sich delphi deswegen beim compilieren beschwert.
und ich wundere mich... schön blöd


ach es geht um den opendialog
gehste mal unter opendialog.options.allowmultiselect:=true;

Mister_X


BM_90 - Di 18.12.07 11:13

Vielen Dank mister_x!! Haut astrein hin. Jetz habe ich aber leider ein neues Problem. Wenn ich, sagen wir mal 5 Bilder öffne, soll er mir die Biler nebeneinander anordnen. Das macht er zwar, wenn ich jetzt aber nochträgllich nochmal welche öffne, läd der die zwar auch, legt sie aber über die vorher geladenen Bilder. Wie mache ich meinem Programm klar, dass er, wenn schon Bilder angezeigt werden, die neuen Bilder daneben anordnen soll??
Und mein zweites Problem ist, dass ich die Bilder per mausklick untendrunter nocheinmal vergrößert darstellen will, das wäre ja im Prinzip nicht das Problem, weil die TImages aber erst beim Laden der Bilder erstellt erstellt werden, habe ich leider nicht die geringste Ahnung, wie das geht. Ich hab es schonmal mit OnClick versucht, aber irgendwie bekomme ich es nicht auf die Reihe.

Ich weiß, ich beanspruche dich ganz schön, aber du scheinst wirklich Ahnung zu haben. Naja und das muss ich nunmal ausnutzen...

VIELEN DANK!


Martin1966 - Di 18.12.07 14:06

user profile iconBM_90 hat folgendes geschrieben:
Vielen Dank mister_x!! Haut astrein hin. Jetz habe ich aber leider ein neues Problem. Wenn ich, sagen wir mal 5 Bilder öffne, soll er mir die Biler nebeneinander anordnen. Das macht er zwar, wenn ich jetzt aber nochträgllich nochmal welche öffne, läd der die zwar auch, legt sie aber über die vorher geladenen Bilder. Wie mache ich meinem Programm klar, dass er, wenn schon Bilder angezeigt werden, die neuen Bilder daneben anordnen soll??


Am besten so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
var 
  Images  : Array[0..100]of TImage; 
  ImagesCount : Integer=0


procedure TForm1.BitBtn1Click(Sender: TObject); 
var I : Integer; 
begin 
  if OpenDialog.Execute then 
    begin 
      for I:=0 to OpenDialog.Files.Count-1 do 
        if ImagesCount<100 then 
          begin 
            Images[ImagesCount] :=  TImage.Create(Self); 
            Images[ImagesCount].Parent  :=  Form1; 
            Images[ImagesCount].Left    :=  (I mod 10)*(Width div 10); 
            Images[ImagesCount].Width   :=  Width div 10
            Images[ImagesCount].Height  :=  Height div 10
            Images[ImagesCount].Top     :=  Trunc(I/10)*(Width div 10); 


            Images[ImagesCount].Stretch :=  true; 
            Images[ImagesCount].Proportional :=  true; 


            Images[ImagesCount].Picture.LoadFromFile(OpenDialog.Files.Strings[I]); 


            Inc(ImagesCount); 
          end
    end
end;


user profile iconBM_90 hat folgendes geschrieben:
Und mein zweites Problem ist, dass ich die Bilder per mausklick untendrunter nocheinmal vergrößert darstellen will, das wäre ja im Prinzip nicht das Problem, weil die TImages aber erst beim Laden der Bilder erstellt erstellt werden, habe ich leider nicht die geringste Ahnung, wie das geht. Ich hab es schonmal mit OnClick versucht, aber irgendwie bekomme ich es nicht auf die Reihe.

Warum sollte das da ein Problem geben? Zeig mal dein Sourcecode Ausschnitt wo du das im OnClick ausprobiert hast.

Lg Martin


BM_90 - Di 18.12.07 17:16

Dankeschön, aber genauso sieht mein Quelltext auch aus...
Wenn ich ein paar Bilder öffne (zB 3), öffnet der die 3 Bilder. Gehe ich dann nochmal auf öffnen und öffne wieder 3 Bilder (ist eigentlich egal wie viele), legt er die neuen einfach über die anderen, un nicht einfach daneben...

Ach ja: wegen dem OnClick. Davon hab ich nicht wirklich Ahnung. War nur so ein Versuch auf gut Glück. Ich hab dann wieder alles über den Haufen geschmissen, weil das nicht funktioniert hat...


mister_x - Di 18.12.07 17:32

user profile iconBM_90 hat folgendes geschrieben:
Dankeschön, aber genauso sieht mein Quelltext auch aus...
Wenn ich ein paar Bilder öffne (zB 3), öffnet der die 3 Bilder. Gehe ich dann nochmal auf öffnen und öffne wieder 3 Bilder (ist eigentlich egal wie viele), legt er die neuen einfach über die anderen, un nicht einfach daneben...

Ach ja: wegen dem OnClick. Davon hab ich nicht wirklich Ahnung. War nur so ein Versuch auf gut Glück. Ich hab dann wieder alles über den Haufen geschmissen, weil das nicht funktioniert hat...


mach einfach


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.BitBtn1Click(Sender: TObject); 
var I ,  L  : Integer; 
begin 
  L  :=  ImagesCount;
  if OpenDialog.Execute then 
    begin 
      for I:=L to L+OpenDialog.Files.Count-1 do 
        if ImagesCount<100 then 
          begin 
            ...
            Images[ImagesCount].Picture.LoadFromFile(OpenDialog.Files.Strings[I-L]); 
            Inc(ImagesCount); 
          end
    end
end;


Mister_X


BM_90 - Di 18.12.07 17:47

SUPER!!!
Das gibt 2 Daum nach oben!


Martin1966 - Mi 19.12.07 14:00

user profile iconBM_90 hat folgendes geschrieben:
Dankeschön, aber genauso sieht mein Quelltext auch aus...

Nein, sieht er nicht!


Deine Version
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.BitBtn1Click(Sender: TObject); 
var I : Integer; 
begin 
  if OpenDialog.Execute then 
    begin 
      for I:=0 to OpenDialog.Files.Count-1 do 
        if I<100 then 
          begin 
            Images[I] :=  TImage.Create(Self); 
            Images[I].Parent  :=  Form1; 
            Images[I].Left    :=  (I mod 10)*(Width div 10); 
            Images[I].Width   :=  Width div 10
            Images[I].Height  :=  Height div 10
            Images[I].Top     :=  Trunc(I/10)*(Width div 10); 
            Images[I].Stretch :=  true; 
            Images[I].Proportional :=  true; 
            Images[I].Picture.LoadFromFile(OpenDialog.Files.Strings[I]); 

            Inc(ImagesCount); 
          end
    end
end;



Meine Version
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.BitBtn1Click(Sender: TObject);  
var I : Integer;  
begin  
  if OpenDialog.Execute then  
    begin  
      for I:=0 to OpenDialog.Files.Count-1 do  
        if ImagesCount<100 then  
          begin  
            Images[ImagesCount] :=  TImage.Create(Self);  
            Images[ImagesCount].Parent  :=  Form1;  
            Images[ImagesCount].Left    :=  (I mod 10)*(Width div 10);  
            Images[ImagesCount].Width   :=  Width div 10;  
            Images[ImagesCount].Height  :=  Height div 10;  
            Images[ImagesCount].Top     :=  Trunc(I/10)*(Width div 10);  
            Images[ImagesCount].Stretch :=  true;  
            Images[ImagesCount].Proportional :=  true;  
            Images[ImagesCount].Picture.LoadFromFile(OpenDialog.Files.Strings[I]);  

            Inc(ImagesCount);  
          end;  
    end;  
end;


Siehst du den Unterschied?

Lg, Martin


BM_90 - Mi 19.12.07 14:17

Das ist aber im Prinzip das selbe, oder??


Martin1966 - Mi 19.12.07 14:23

Äh.. Die Variable I (welche lokal definiert ist) und die Variable ImagesCount (welche global definiert ist) haben doch völlig unterschiedliche Aufgaben, oder?


BM_90 - Mi 19.12.07 14:47

Ach ich weiß auch nicht, kann schon sein...


Martin1966 - Mi 19.12.07 15:30

Soll das jetzt ein Scherz sein? Wenn du keine Lust mehr hast dann sag bescheid. Dann versuche ich es erst gar nicht dir zu helfen.


BM_90 - Do 03.01.08 14:31

Hä?? Wie kommste denn jetz da drauf?


Narses - Do 03.01.08 14:40

Moin!

user profile iconBM_90 hat folgendes geschrieben:
Hä?? Wie kommste denn jetz da drauf?
Das ist ganz leicht: du machst deutlich den Eindruck, dass es dir nicht wichtig ist (hier was zu lernen). :nixweiss: Das man da schonmal so Reaktionen wie von user profile iconMartin1966 "erntet", ist wohl normal. :)

Vorsorglich: bitte beim Thema bleiben. ;)

cu
Narses


BM_90 - Do 03.01.08 16:41

tut mir ja leid, ich bemühe mich ja wie sau, wenn ich dann aber trotzdem nicht weiter komme, verliere ich auch irgendwann die lust. außerdem hab ich selber kein internet, schreibe deshalb manchmal ewigkeiten nicht zurück...