Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android, ein Bitmap speichern geht ncht (https://www.delphipraxis.net/182335-android-ein-bitmap-speichern-geht-ncht.html)

Kostas 17. Okt 2014 14:51

Android, ein Bitmap speichern geht ncht
 
Hallo Zusammen,

eine allgemeine Frage, kann es sein dass Android kein bmp kennt?

Ich erstelle zur Laufzeit ein BMP und zeichne in dessen canvas.
Das BMP kann ich zur Anzeige in eine TImangeViewer geben.
Versuche ich nun das BMP zu speichern, bekomme ich eine Fehlermeldung
das Speichern ist fehlgeschlagen. Versuche ich ein TMemo in exakt den gleichen Pfad
zu speichern funktioniert es einwandfrei und auch das lesen.

Delphi-Quellcode:
  //das geht
  aMemoFile := GetHomePath + PathDelim + 'Memo.txt';
  Memo1.Lines.SaveToFile(aMemoFile);

  //das geht nicht
  aImageFile := GetHomePath + PathDelim + 'image.bmp';
  bmp.SaveToFile(aImageFile);


  //auch das geht nicht
  aImageFile := GetHomePath + PathDelim + 'image.bmp';
  ImageViewer1.Bitmap := bmp; //bmp wir angezeigt.
  ImageViewer1.Bitmap.SaveToFile(aImageFile);

Hat jemand eine Idee?

mkinzler 17. Okt 2014 14:53

AW: Android, ein Bitmap speichern geht ncht
 
Welcher Fehler?
Warum Bitmap?

Kostas 17. Okt 2014 15:05

AW: Android, ein Bitmap speichern geht ncht
 
Zitat:

Zitat von mkinzler (Beitrag 1276417)
Welcher Fehler?
Warum Bitmap?

Hallo Markus,

ich bekomme eine Ecxeption EBitmapSavingFailed Speichern des Bitmaps fehlgeschlagen.

Warum ein bmp, nun ich erstelle temporär ein TBitmap und zeichne auf dessen Canvas.
Danach möchte ich das Bitmap als File speichern. Das Bitmap wird danach einer TMSFMXWebGMaps1
Komponente als Marker übergeben. Das Teil kann leider kein Image als Stream empfangen sondern
nur ein File.

mkinzler 17. Okt 2014 15:08

AW: Android, ein Bitmap speichern geht ncht
 
das Windows-Bitmapformat wird von Android nicht unterstützt. Nimm besser PNG

http://developer.android.com/referen...essFormat.html

Kostas 17. Okt 2014 15:18

AW: Android, ein Bitmap speichern geht ncht
 
Zitat:

Zitat von mkinzler (Beitrag 1276425)
das Windows-Bitmapformat wird von Android nicht unterstützt. Nimm besser PNG

http://developer.android.com/referen...essFormat.html

ah, tausend Dank, das erklärt natürlich alles.
Ist dir zufällig bekannt wo die PNG Klasse steckt?

mkinzler 17. Okt 2014 15:19

AW: Android, ein Bitmap speichern geht ncht
 
Kann die FMX-Bitmap-Klasse von sich aus.

Kostas 17. Okt 2014 16:04

AW: Android, ein Bitmap speichern geht ncht
 
Zitat:

Zitat von mkinzler (Beitrag 1276430)
Kann die FMX-Bitmap-Klasse von sich aus.

ich habe jetzt direkt keine Klasse für PNG gefunden. Ober meinst du die Sache mit TBitmapCodecManager?

mkinzler 17. Okt 2014 16:06

AW: Android, ein Bitmap speichern geht ncht
 
Der Codec wird anhand der Endung erkannt.

Sir Rufo 17. Okt 2014 16:08

AW: Android, ein Bitmap speichern geht ncht
 
Du musst einfach nur speichern, anhand der Datei-Erweiterung wird automatisch das passende Format gewählt.

Kostas 18. Okt 2014 10:56

AW: Android, ein Bitmap speichern geht ncht
 
Hallo zusammen,

das Problem vorab, ich finde die Datei nicht.

irgendwie spreche ich nicht Android, ich sollte es mal mit klingonisch vesuchen. :-(

Testhalber habe ich ein TMemo in ein File geschrieben. Ich kann auch das File lesen,
doch finden kann ich es nicht.

Delphi-Quellcode:
  aMemoFile := TPath.GetSharedDocumentsPath + TPath.DirectorySeparatorChar + 'Memo.txt';
  Memo1.Lines.add(aMemoFile);
  Memo1.Lines.SaveToFile(aMemoFile);
Dem Samsung Tab habe ich eine SD-Card verpasst.
Als Speicherort wird ausgegeben:
/storage/emulated/0/Adroid/data/com.embarcadero.PngProblem/files/Memo.txt

Ich suche nun nach Memo.txt über den Datamanager vom Tab auf "SD Card" und finde nichts.
Ebenso wenig über den Windows Dateiexplorer. Kann es sein das die Files hiden sind?
Auch im Gerätespeicher ist nichts zu finden. Die Memo.txt wird jedoch geladen mit Memo1.Lines.LoadFromFile(aMemoFile); Warum kann ich die Datei nicht finden?

Bezüglich bmp als png speichern, sicht es etwas anders aus. Ich bekomme beim speichern keine Fehlermeldung.
Doch die Datei kann geladen werden jedoch kann sie nicht gefunden wird.


Delphi-Quellcode:
   
  aImageFile := TPath.GetSharedDocumentsPath + TPath.DirectorySeparatorChar + 'image.png';
  ImageViewer1.Bitmap := bmp; //Image wird angezeigt.
  bmp.SaveToFile(aImageFile); //keine Fehlermeldung.

  if FileExists(aImageFile)then //Image wird nicht gefunden
  begin
    ImageViewer2.Bitmap.LoadFromFile(aImageFile);
  end;
Hat jemand eine Idee?
Gruß Kostas

Sir Rufo 18. Okt 2014 11:23

AW: Android, ein Bitmap speichern geht ncht
 
Also nochmal
Android kennt das BMP-Format nicht!

Ein Bild zu speichern ist unter FMX so einfach wie Luft holen
Delphi-Quellcode:
procedure TMainForm.TakePhotoFromCameraAction1DidFinishTaking( Image: TBitmap );
var
  LImageFilename: string;
begin
  // Zur Kontrolle in der Form anzeigen
  Image1.Bitmap := Image;
  // Dateiname basteln
  LImageFilename := TPath.Combine( TPath.GetSharedPicturesPath, FormatDateTime( '"img_"yyyymmddhhnnss".png"', Now ) );
  // Speichern
  Image.SaveToFile( LImageFilename );
  // Pfad in das Label schreiben
  Label1.Text := LImageFilename;
end;
Da ich SharedPicturesPath genommen habe und der Pfad mit
Code:
/storage/emulated/0/Pictures
(man beachte das emulated und informiert sich mal bei Google)
finde ich die Datei
  • Android (Eigene Dateien App):
    Code:
    Gerätespeciher/Pictures
  • Windows (Explorer):
    Code:
    <Gerät>\Tablet\Pictures
Warum? Weil dieser Pfad auch dann existiert, wenn keine externe Speicherkarte angeschlossen wurde. Darum steht im Pfad auch emulated!

Ach ja, und wenn das als JPEG abgespeichert werden soll, dann einfach
Delphi-Quellcode:
  // Dateiname basteln
  LImageFilename := TPath.Combine( TPath.GetSharedPicturesPath, FormatDateTime( '"img_"yyyymmddhhnnss".jpg"', Now ) );

Kostas 18. Okt 2014 16:34

AW: Android, ein Bitmap speichern geht ncht
 
oh je, wahrscheinlich hat es immer funktioniert. Es ist nur ein komisches Verhalten.

Wenn der Ordner leer ist und ich erstelle über die App ein File, wird das File im Windows-Explorer nicht
angezeigt auch nicht bei F5 und auch nicht wenn ich den Explorer neu starte. Kopiere ich jedoch irgendeine
Datei in \Tablet\Pictures erscheinen danach auch die Files die ich per App erstellt habe. Danach funktioniert auch das aktualisieren mit F5 sofort. Ich schreibe auch in den gleichen Path \Tablet\Pictures
den Inhalt eines Memo in ein Textfile. Das gleiche Verhalten.

Im Dateimanager vom Tab werden die Files sofort angezeigt.

Zum Thema Image als png anlegen.
Das funktioniert auch einwandfrei.
Wenn ich das File direkt lade etwa so:
Delphi-Quellcode:
ImageViewer2.Bitmap.LoadFromFile(atmpImageFile);
funktioniert es nicht.

Aber so funktioniert es:
Delphi-Quellcode:
  bmp:=FMX.Graphics.TBitmap.Create;
  bmp.LoadFromFile(atmpImageFile);
  ImageViewer2.Bitmap := bmp;

himitsu 18. Okt 2014 17:27

AW: Android, ein Bitmap speichern geht ncht
 
Zitat:

Zitat von Kostas (Beitrag 1276508)
Delphi-Quellcode:
  aMemoFile := TPath.GetSharedDocumentsPath + TPath.DirectorySeparatorChar + 'Memo.txt';
  Memo1.Lines.add(aMemoFile);
  Memo1.Lines.SaveToFile(aMemoFile);
Dem Samsung Tab habe ich eine SD-Card verpasst.
Als Speicherort wird ausgegeben:
/storage/emulated/0/Adroid/data/com.embarcadero.PngProblem/files/Memo.txt

Ich suche nun nach Memo.txt über den Datamanager vom Tab auf "SD Card" und finde nichts.
...


Zitat:

Zitat von MEissing (Beitrag 1276401)
Siehe Googles:
Die verbieten seit Android 4.4.2 das direkte Schreiben auf die SD Karte....

;-)

aus http://www.delphipraxis.net/182322-f...ml#post1276401

:gruebel:

Kostas 18. Okt 2014 21:22

AW: Android, ein Bitmap speichern geht ncht
 
Danke wieder einmal himitzu,
wieder ein Puzzle weiter. :-)

Dir noch eine schöne Zeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 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