AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Dateigröße (voraus-)berechnen?
Thema durchsuchen
Ansicht
Themen-Optionen

Dateigröße (voraus-)berechnen?

Ein Thema von Airblader · begonnen am 31. Okt 2004 · letzter Beitrag vom 31. Okt 2004
Antwort Antwort
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#1

Dateigröße (voraus-)berechnen?

  Alt 31. Okt 2004, 00:48
Hi
Sorry, dass ich euch schon wieder nerven muss *g*

Folgendes:
Beim Speichern will ich per TrackBar die Kompression der zu speichernden (JPG)Datei ändern.
An sich kein Problem.
Da es um eine bestimmte Sorte Grafikn geht, wo die Anwender genau die Größe wissen müssen (frgat bitte nicht - es ist so ), will ich "live" die kB größe anzeigen.

Nunja.
2 Ansätze:
----------

1. Datei temporär speichern, Größe lesen, löschen, Größe anzeigen.
Nachteil: SEHR langsam (speziell bei größeren Grafiken)

2. (Auf Tipp hin):
JPG-Algorithmus nehmen, verstehen und damit die Größe berechnen.
Nachteil: (Langsam? ) Man muss den Algortihmus erstmal verstehen *g* Ich hab ihn gesehen...und es ist

--------------------------------------

Naja...Zusammengefasst:
Hat jemand eine Idee / einen Ansatz?

Wäre über Ideen o.ä. froh

Air

---
P.S.:
Kann man bei TrackBars den gestrichelten Kasten biem anklicken/markieren verhindern?
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Benutzerbild von gmarts
gmarts

Registriert seit: 4. Apr 2004
Ort: Templin
290 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Dateigröße (voraus-)berechnen?

  Alt 31. Okt 2004, 01:35
Zitat von Airblader:
Hi
1. Datei temporär speichern, Größe lesen, löschen, Größe anzeigen.
Nachteil: SEHR langsam (speziell bei größeren Grafiken)

2. (Auf Tipp hin):
JPG-Algorithmus nehmen, verstehen und damit die Größe berechnen.
Nachteil: (Langsam? ) Man muss den Algortihmus erstmal verstehen *g* Ich hab ihn gesehen...und es ist

--------------------------------------
1. Genau so wirds gemacht. Alternativ kannst du auch nur zB. die Hälfe des Bildes nehmen und so auf die Zeit des ganzen Bildes schließen (Funktioniert nicht bei Bildern die in ihrer Komplexität varieren(z.B. Obere Hälfte Blauer Himmel, untere Hälfe Blumenfeld));

2. Wie gesagt; da Bildermotive unterschiedlich komplex sein können, kannst du es nicht genau vorausberechnen wie lange es dauert.


Edit: Ach..ich bin schon etwas müde. ...naja...dir gehts nicht um die Verschlüsslungszeit, sondern um die Größe.... Ist das gleiche in grün.
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Click;
end;
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Dateigröße (voraus-)berechnen?

  Alt 31. Okt 2004, 02:42
Bin gerade dabei JPEG zu verstehen, und nachzuproggen. Leider ist das echt nicht einfach... aber es sei gesagt, dass es keinen Unterschied macht ob du den Algo verstehst oder nicht - du wirst eine Testdatei machen müssen (oder zumindest einen MemoryStream) um eine brauchbare Vorschau der Größe gebebn zu können. Zumindest die Cosinustransformation muss passieren - den Huffmann kann man sich u.U. dafür sogar sparen. Aber eine Schätz-Routine wird aller Wahrscheinlich nach deutlich langsamer sein als ein gut programmierter Huffmann - die DCT wird imho den Großteil der Zeit benötigen.
Die Größe der Datei hängt bei JPEG dermaßen stark vom Inhalt ab, dass es nahezu unmöglich ist die Größe zu bestimmen bevor man nicht in echt eine vollständige Kompression gemacht hat.
Evtl. sind hoch optimierte Schätz-Algos denkbar, aber wahrscheinlich mathematisch irrsinnig komplex, und dann u.U. auch nur bedingt bauchchbar.

Du könntest ja mal versuchen das Bild um einen Faktor zu verkleinern - mit verschiedenen Antialiasingmethoden am besten - und dann abschätzen wie die Größe des verkleinerten in Zusammenhang mit dem Original steht. Aber da solltest du mit allen möglich Varianten von Bildern testen: Eine einfarbige Bitmap, Fotos div. Motive, Zeichnungen, s/w-Rauschen, Farbrauschen etc.
Und mit verschiednen AA-Methoden, da das einen starken Einfluss auf die Komprimierbarkeit haben dürfte.

Fazit: Lass besser eine Testdatei erstellen

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Dateigröße (voraus-)berechnen?

  Alt 31. Okt 2004, 09:55
Das Bild zu komprimieren wirst du wohl müssen, aber auf die Platte speichern muss dann nicht sein. Diese Zeit kannst du dir sparen, indem die Umwandlung nur im Speicher vornimmst. Auf heutigen Rechnern dürfte das auch nicht allzu lange dauern. Wenn das in einem Thread im Hintergrund abläuft, wird der Benutzer davon auch nicht gestört.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#5

Re: Dateigröße (voraus-)berechnen?

  Alt 31. Okt 2004, 10:19
Naja...ok...dann halt so

Nun...wie erstell ich die Datei nur temporär/im Speicher oder wie auch immer? *g*

Ich hab eben das gefunden:

function FileCreateTemp(var Prefix: string): THandle; Ich hoffe, dass ich das nun der (englischen) Hilfe richtig entnommen habe:

Die ersten 3 Buchstaben des Speichernamens ergeben den temporären Dateinamen.
Wenn die Datei erstellt werden konnte, liefert die Funktion den THandle für die Datei.
Wenn ich mit der Datie fertig bin, kann ich sie mit CloseHandle() schliessen.

D.h., wenn ich habe:

FileCreateTemp('datei.jpg'); ist der Dateiname nur 'dat.jpg' ?
Und der THandle liefert mir ja den kompletten Pfad mit zurück.

D.h., um die Datei zu erstellen, müsste ich aber so vorgehen:

Delphi-Quellcode:
Assign(FormX.Image1.Picture.Bitmap);
FileCreateTemp('datei.jpg');
/Edit:
Hm...um darauf zuzugreifen, muss ich dann eine variable mit typ THandle haben und in diese dann die Funktion speichern?
Also so?:
Delphi-Quellcode:
var s: THandle;
...
Assign(FormX.Image1.Picture.Bitmap);
s := FileCreateTemp('datei.jpg');
Und dann ist 's' mein kompletter Handle?

/edit2:
Hm...was muss ich noch "usen", damit er FileCreateTemp kennt?
Im Moment gibt er mir undefin. Bez.

air
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 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