2016-04-02 3 views
1

In einer mobilen App werden ein oder mehrere Bilder (nur JPEG/JPG) - entweder mit eingebauter Kamera oder ausgewählt aus Fotobibliothek - vor dem Hochladen auf einen Web-Service angezeigt.Firemonkey: Das Laden eines JPEGs in einen beliebigen Bildsteuerungstyp und das Speichern in einer Datei oder einem Stream macht es kleiner. Kann dies vermieden werden?

Aber Laden eines Bildes in eine FMX TImage/TImageControl/TImageViewer und Speichern in Stream (oder Datei) macht es kleiner, etwa 45%.

Eine Idee, warum das passiert und gibt es eine Möglichkeit, die Größenreduktion zu vermeiden?

Was dies gefragt ist der einfache Test-Code, nichts Besonderes daran:

procedure TImageTest.btnTestClick(Sender: TObject); 
var 
    aFile : string; 
begin 
    if not OpenDialog.Execute then 
    Exit; 
    // get jpg file name for loading 
    aFile := OpenDialog.Filename; 
    // load into TImage, TImageControl or TImageViewer 
    ImageViewer.Bitmap.LoadFromFile(aFile); 
    // and save to file for comparison 
    ImageViewer.Bitmap.SaveToFile(aFile+'_2.jpg'); 
end; 
+0

Wo habe ich nach Debugging-Hilfe gefragt? Oder fragen Sie, warum der Code nicht funktioniert? Es handelt sich um eine Frage zum Verhalten von Firefemonkey-Bildkomponenten, die mit der einfachsten Test-App einfach reproduziert werden können. –

+1

Jpeg ist kein verlustfreies Format. Jedes Laden und Speichern führt zu einem Qualitätsverlust. Warum ist ein solcher Qualitätsverlust schwer zu sagen ohne Ihren genauen Code? Wenn Sie ein Bild zum Web-Service hochladen müssen, laden Sie den ursprünglichen Dateistream anstelle der Zwischendarstellung von den FMX-Steuerelementen hoch. –

+0

Welche Delphi-Version verwenden Sie? –

Antwort

1

Die ideale Lösung zur Vermeidung Qualitätsverlust durch nicht auf den visuellen Kontrollen verlassen Ihre Daten zu speichern. Behalten Sie stattdessen ein Hintergrundobjekt, das die Rohbilddatei enthält, und verwenden Sie nur die visuellen Steuerelemente, um dieses Bild dem Benutzer anzuzeigen. Wenn Sie das Bild speichern möchten, speichern Sie es von diesem Hintergrundobjekt und nicht von der visuellen Kontrolle.

Das gleiche Konzept gilt für alle Aspekte der Programmierung - visuelle Kontrollen dienen nur zur visuellen Anzeige für den Benutzer, nicht zum Speichern von Daten.

+0

Bilder werden nicht als Dateien auf mobilen Geräten behandelt, Daten werden als TBitmap-Objekte entweder von der Kamera oder von der Bibliothek geliefert. Die Anzeige dient nur der abschließenden Überprüfung vor dem Hochladen, die nicht für die Speicherung gedacht ist. Auf der anderen Seite verwendet jede Bildkontrolle nur TBitmap zum Speichern von Bildern - also wo bleibt der Unterschied, die Bilddaten in einem anderen Hintergrund-TBitmap-Objekt zu halten? Und wenn ich vor dem Upload in einer temporären Datei gespeichert bin, komme ich zurück auf das Problem: Reduktion der Größe. –

+0

Visuelle Kontrollen oder nicht sind nicht wirklich das Problem. Sie rekodieren die Datei. Warum? –

+0

Wo habe ich gesagt, dass ich die Datei umcodiere? –