Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bilder speichern (https://www.delphipraxis.net/182015-bilder-speichern.html)

masterzibu 24. Sep 2014 16:05

Bilder speichern
 
Hallo zusammen

Hab da mal eine allgemeine Fragen, wo ich irgend wie nirgents eine klare Antwort finde. Bin auch noch ziemlich neu hier in der Delphi welt...
Bezieht sich für eine App mit Firemonkey für Android und iOS (vielleicht später mal für Mac und Windows).
Ich möchte Smartphone-Kamera-Bilder Speichern und in einem späteren Schritt in einer Bilder-Liste anschauen können.
Mach ich das besser mit einer Datenbank oder mit einem lokalen Ordner auf dem Smartphone?
Die Bilder sollten wenn möglich verschlüsselt abgelegt werden können (nicht so wichtig).

Gruss zibu

Sir Rufo 24. Sep 2014 16:26

AW: Bilder speichern
 
Du kannst die einfach nur in einem Ordner speichern und wenn du noch zusätzliche Daten benötigst, dann speicherst du diese Daten in einer Datenbank mit einer Referenz zu dem Bild (z.B. Dateiname).

masterzibu 24. Sep 2014 16:41

AW: Bilder speichern
 
OK Danke.
Und wenn ich einen Ordner auf dem Smartphone erzeuge, wird dieser schon verschlüsselt gespeicher oder wie kann man das machen, das die Bilder nicht anders gebraucht werden können?

Sir Rufo 24. Sep 2014 17:28

AW: Bilder speichern
 
Wenn du das im OS eingestellt hast, dann wird auch direkt verschlüsselt abgelegt (geht auf jeden Fall bei Android)

masterzibu 7. Okt 2014 14:13

AW: Bilder speichern
 
Ok Danke, und mit OS meinst du was genau? :-)

Habe da mal etwas probiert mit forcedirectories, dies funktioniert aber nicht wirklich wenn ich als ZielOrdner einfach nur 'Bilder' angebe.
Muss ich ,da dies auf dem Smartphone läuft, irgent wie mit
forcedirecories (TPath.Combine(TPath.GetDocumentsPath, 'Bilder'))
machen?
oder wie geht das genau?

Danke schon mal

Jumpy 7. Okt 2014 15:52

AW: Bilder speichern
 
Zitat:

Zitat von masterzibu (Beitrag 1275123)
Ok Danke, und mit OS meinst du was genau? :-)

Operating System?

masterzibu 8. Okt 2014 10:42

AW: Bilder speichern
 
OK Danke, das weiss ich nun.

Aber wie sieht das mit einem Ordner erzeugen auf einem Android Smartphone aus. Wie funktioniert das, dass ich dort meine Handykamerabilder ablegen kann, sehe da überhaupt nicht durch...

grüsse

mjustin 8. Okt 2014 10:53

AW: Bilder speichern
 
Basierend auf dieser SO Antwort:
Delphi-Quellcode:
ImageContainer.Bitmap.SaveToFile(System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim + 'myfile.jpg');

(Bin gerade selber mit der Android Kamera beschäftigt - allerdings in Java, hoffe dass der Tipp weiterhilft)

himitsu 8. Okt 2014 11:27

AW: Bilder speichern
 
Es gibt übrigens auch TPath.Combine, um Pfade und Dateinamen zu kombinieren.

Müsste in etwa so aussehn.
Delphi-Quellcode:
ImageContainer.Bitmap.SaveToFile(TPath.Combine(TPath.GetDocumentsPath, 'myfile.jpg'));
Man könnte TPath.GetDocumentsPath auch mit IncludePathDelimiter aufrufen, welches den Delimiter anhängt, wenn noch keiner vorhanden ist.
Aber anhand des Namens (GetDocumentsPath und nicht Dir) müsste da bereits der Delimiter enthalten sein. :stupid:

masterzibu 13. Okt 2014 13:13

AW: Bilder speichern
 
OK Danke für die Antworten, funktioniert so weit.
Und wie genau stelle ich die gespeicherten Bilder in einer Liste dar?
Und wie zeige ich dann ein ausgewähltes Bild in einem Timage?

himitsu 13. Okt 2014 14:03

AW: Bilder speichern
 
Indem du die Dateinamen einliest, sie in einer Listenkomponente darstellst?
Und beim Wechsel der Selektierung liest du den aktuell gewählten Dateinamen aus der Liste und lädst das Bild in eine Imagekomponente.


PS:
Delphi-Quellcode:
Bitmap.SaveToFile(... + 'myfile.jpg');
speichert zwar das Bild in einer Datei, aber auch wenn die Datei *.jpg heißt, ist darin natürlich ein Bitmap (*.bmp), da Bitmap halt ein Bitmap ist und auch nur Bitmaps speichern kann.

masterzibu 13. Okt 2014 14:13

AW: Bilder speichern
 
OK danke,probier das mal.
Habe aber schon ein problem beim Anzeigen eines Bildes.
Speichere das Bild so:

Delphi-Quellcode:
procedure TForm6.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap);
begin
 Image1.Bitmap.Assign(Image) ;
 Image1.Bitmap.SaveToFile(TPath.Combine(TPath.GetDocumentsPath, 'myfile.jpg'));
end;
Und so möchte ich es wieder Anzeigen:

Delphi-Quellcode:
procedure TForm11.Button123Click(Sender: TObject);
begin
  Image1.bitmap.LoadFromFile('myfile.jpg');
end;
Da kommt aber auf dem Smartphone die Fehlermeldung: Zugriffsverletzung bei Adresse 788526E8 beim Zugriff auf Adresse 0000000.
Was mach ich falsch? :oops:

mkinzler 13. Okt 2014 14:22

AW: Bilder speichern
 
Beim Laden sollte man genausowenig relative Pfade verwenden. Bau Dir den absoluten, entsprechend der Speicherroutine zusammen.

Btw. Bitte verwende Delphi-Tags.

himitsu 13. Okt 2014 15:12

AW: Bilder speichern
 
Da es wohl überlesen wurde:
Du speicherst Bitmaps, also sollte der Dateiname myfile.bmp heißen.

Zitat:

Was mach ich falsch?
Du hast vergessen zu sagen bei welcher Codezeile, wobei du auch gleich selber mal mit dem debugger schauen kannst, ob vor der Exception (also Halepunkt auf die Zeile, wo es knallt) eine der Variablen NIL ist.
(denn die Fehlermeldung klingt nach einem Zugriff auf einen NIL-Pointer/Objektzeiger)

Insgesamt sehen deine paar gezeigten Codezeilen erstmal nicht direkt falsch aus.

Sir Rufo 13. Okt 2014 18:27

AW: Bilder speichern
 
@himitsu

Du weisst, dass es sich um FMX handelt? Da kann
Delphi-Quellcode:
TBitmap
erheblich mehr.

Olli73 13. Okt 2014 18:29

AW: Bilder speichern
 
Zitat:

Zitat von himitsu (Beitrag 1275750)
PS:
Delphi-Quellcode:
Bitmap.SaveToFile(... + 'myfile.jpg');
speichert zwar das Bild in einer Datei, aber auch wenn die Datei *.jpg heißt, ist darin natürlich ein Bitmap (*.bmp), da Bitmap halt ein Bitmap ist und auch nur Bitmaps speichern kann.

Zumindest Firemonkey/XE5 ist intelligenter als man denkt:

Delphi-Quellcode:
procedure TBitmap.SaveToFile(const AFileName: string; const SaveParams: PBitmapCodecSaveParams = nil);
begin
  TBitmapCodecManager.SaveToFile(AFileName, Self, SaveParams);
end;


class function TBitmapCodecManager.SaveToFile(const AFileName: string; const Bitmap: TBitmap;
  const SaveParams: PBitmapCodecSaveParams = nil): Boolean;
var
  Codec: TCustomBitmapCodec;
  Descriptor: TBitmapCodecClassDescriptor;
begin
  Result := False;
  if Assigned(FBitmapCodecClassDescriptors) then
    for Descriptor in FBitmapCodecClassDescriptors do
      if SameText(ExtractFileExt(AFileName), Descriptor.Extension, loUserLocale) and Descriptor.CanSave then
      begin
        Codec := Descriptor.BitmapCodecClass.Create;
        try
          Result := Codec.SaveToFile(AFileName, Bitmap, SaveParams);
        finally
          Codec.Free;
        end;
      end;
end;
Ich war auch (vor einiger Zeit) erstaunt, dass das so einfach geht.

Gruß,
Olli

Edit: Ich war zu lahm...

Sir Rufo 13. Okt 2014 18:38

AW: Bilder speichern
 
@Olli73

Evtl. war ich nur schneller :mrgreen:

himitsu 13. Okt 2014 19:34

AW: Bilder speichern
 
Zitat:

Zitat von Sir Rufo (Beitrag 1275759)
@himitsu

Du weisst, dass es sich um FMX handelt? Da kann
Delphi-Quellcode:
TBitmap
erheblich mehr.

Sicher?
Aber warum heißt es dann TBitmap und nicht TBildirgendwas? :shock:

Sir Rufo 13. Okt 2014 20:36

AW: Bilder speichern
 
Zitat:

Zitat von himitsu (Beitrag 1275771)
Zitat:

Zitat von Sir Rufo (Beitrag 1275759)
@himitsu

Du weisst, dass es sich um FMX handelt? Da kann
Delphi-Quellcode:
TBitmap
erheblich mehr.

Sicher?
Aber warum heißt es dann TBitmap und nicht TBildirgendwas? :shock:

Ja, kuckst du Doku Delphi-Referenz durchsuchenFMX.Graphics.TBitmap ;)

himitsu 13. Okt 2014 20:44

AW: Bilder speichern
 
Na toll, in der VCL wird also doch nichts mehr weiterentwickelt.

masterzibu 16. Okt 2014 21:50

AW: Bilder speichern
 
Also ich seh da immer noch überhaupt nicht durch...

Wenn ich mit der Smartphone-kamera immer ein Bild aufnehme und dann das Bild abspeichere (als zum Beispiel 'mypic') , wird dann nicht das alte Bild, mit dem selben Name, nicht einfach überschrieben? Kann man da vielleicht das Datum/Uhrzeit als Dateiname verwenden?

Und wie gross ist die Auflösung eines .bmp? wird die Datei der Smartphone Kamera komprimiert oder wird diese als Orginalgrösse gespeichert?

Zudem weiss ich immer noch nicht wie ich die Bilder einfach in einen Ordner abspeichern kann, so dass diese auch bei einem App neustart immer noch auf dem Smartphone sind. Wenn ich
Delphi-Quellcode:
Image1.Bitmap.SaveToFile(System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim + 'myfile1.jpg')
verwende, wie heisst dann der erzeugt Ordner bzw. Datei genau?

Und wie zeige ich alle die gespeicherten Bilder in einer Liste da?

Vielen Dank für die Geduld für einen Anfängers...:spin2:

Grüsse

Sir Rufo 16. Okt 2014 22:12

AW: Bilder speichern
 
Zitat:

Zitat von masterzibu (Beitrag 1276313)
Wenn ich mit der Smartphone-kamera immer ein Bild aufnehme und dann das Bild abspeichere (als zum Beispiel 'mypic') , wird dann nicht das alte Bild, mit dem selben Name, nicht einfach überschrieben? Kann man da vielleicht das Datum/Uhrzeit als Dateiname verwenden?

Du legst den Dateinamen fest, also hast du es in der Hand, wie die Datei benannt wird. Ob dabei die zuletzt gewählte Telefonnummer, oder der Name des zuletzt angelegten Kontakts, oder eben irgendwas aus Datum und Uhrzeit ... deiner Fantasie sind dabei keine Grenzen gesetzt (bis auf ein paar Zeichen, die eben eine besondere Bedeutung haben).
Zitat:

Zitat von masterzibu (Beitrag 1276313)
Und wie gross ist die Auflösung eines .bmp? wird die Datei der Smartphone Kamera komprimiert oder wird diese als Orginalgrösse gespeichert?

Äh, ein Bitmap (BMP-Format) hat die Auflösung, die das Bild hat ... äh, also irendwie jede? Und wieso überhaupt willst du das im Bitmap-Format speichern? :gruebel:
Zitat:

Zitat von masterzibu (Beitrag 1276313)
Zudem weiss ich immer noch nicht wie ich die Bilder einfach in einen Ordner abspeichern kann, so dass diese auch bei einem App neustart immer noch auf dem Smartphone sind. Wenn ich
Delphi-Quellcode:
Image1.Bitmap.SaveToFile(System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim + 'myfile1.jpg')
verwende, wie heisst dann der erzeugt Ordner bzw. Datei genau?

Wenn ich mir nicht sicher bin, was das für einen Pfad ergibt, dann - Achtung - lasse ich mir den Pfad einfach mal (in einem Edit oder wo auch immer) ausgeben. Ab dann weiß ich es.

Es gibt allerdings auch entsprechende Bilder-Ordner, wie man der Doku entnehmen kann => Delphi-Referenz durchsuchenSystem.IOUtils.TPath
Zitat:

Zitat von masterzibu (Beitrag 1276313)
Und wie zeige ich alle die gespeicherten Bilder in einer Liste da?

Kommt darauf an wie du die gespeichert hast. Einfach nur als Bilddatei in einem Ordner, dann eben alle Dateinamen aus diesem Ordner auflisten Delphi-Referenz durchsuchenSystem.IOUtils.TDirectory. Damit hast du schon mal, was du zeigen möchtest. Aber wie möchtest du das anzeigen?

Eine Liste (Delphi-Referenz durchsuchenFMX.ListView.TListView oder Delphi-Referenz durchsuchenFMX.ListBox.TListBox), Grid (Delphi-Referenz durchsuchenFMX.ListBox.TListBox), Einzelbilder (Delphi-Referenz durchsuchenFMX.TabControl.TTabControl)

masterzibu 23. Okt 2014 12:26

AW: Bilder speichern
 
Danke für die Hilfe, hat alles geklappt bis auf:

Zitat:

Zitat von masterzibu:
Und wie zeige ich alle die gespeicherten Bilder in einer Liste da?
Kommt darauf an wie du die gespeichert hast. Einfach nur als Bilddatei in einem Ordner, dann eben alle Dateinamen aus diesem Ordner auflisten Delphi-Referenz durchsuchenSystem.IOUtils.TDirectory. Damit hast du schon mal, was du zeigen möchtest. Aber wie möchtest du das anzeigen?

Eine Liste (Delphi-Referenz durchsuchenFMX.ListView.TListView oder Delphi-Referenz durchsuchenFMX.ListBox.TListBox), Grid (Delphi-Referenz durchsuchenFMX.ListBox.TListBox), Einzelbilder (Delphi-Referenz durchsuchenFMX.TabControl.TTabControl)
Scheitere schon beim auflisten der Dateinamen? wie geht das?
Habe mir Listview und Listbox mal angeschaut und scheint schon etwas so das zu sein was ich brauche.
Möchte 2 Spalten, mit Dateiname und Vorschaubild (oder so ähnlich), ich sehe bei der Listbox bzw. Listview überhaupt nicht durch, wie muss ich den Codeschreiben das mir das so angezeigt wird und alle Bilder inkl. Dateiname reinlädt?

Danke

Grüsse


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz