| Autor |
Beitrag |
Nemo
      
Beiträge: 26
Win 2000/WinXP
D7 Prof
|
Verfasst: Mo 28.02.05 11:23
Guten Morgen!
Ein Assign für eine BMP Datei/TImage Komponente dauert bei einer 3 MB großen Jpeg Datei eine ganze Weile. Ich brauche nur eine ganz kleine Vorschau 150x100 px oder so. Gibt es eine Routine, bzw. macht es Sinn die jpeg Dateien vorher irgendwie runterzurechnen?
Alle meine Resize Prozeduren basieren auf BMP, amcht so also wenig Sinn.
 Vielleicht muss man bei der TImage Komponente nur irgend etwas anders einstellen? Oder vorher mit compressQuality etwas machen
Für alle Anregungen bin ich wie immer sehr dankbar!
|
|
Amiga-Fan
      
Beiträge: 534
|
Verfasst: Mo 28.02.05 11:36
wenn ich mich nicht irre ist in jedem jpg-Bild eine Vorschau gespeichert. Aber genaueres weiß ich auch nicht...
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mo 28.02.05 12:04
In jedem JPG eine Vorschau? Ne, das wäre ja total unsinnig!
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 28.02.05 12:09
stretchblt sollte schon ziemlich schnell sein, weiß ja net wie du das anders gelöst hast (scanline oder pixesl[] <- sehr langsam)
|
|
Amiga-Fan
      
Beiträge: 534
|
Verfasst: Mo 28.02.05 12:19
|
|
patrick
      
Beiträge: 1481
WIN2k, WIN XP
D6 Personal, D2005 PE
|
Verfasst: Mo 28.02.05 12:19
| delfiphan hat folgendes geschrieben: | | In jedem JPG eine Vorschau? Ne, das wäre ja total unsinnig! |
wieso unsinnig?
tatsache ist, dass der header einer JPEG-datei ermöglicht u.a. ein thumbnail bereits in die datei mit zu integrieren.
manche programme machen das automatisch, manche mit option, die meisten jedoch gar nicht.
du würdest dich wundern was alles für informationnen in so nem einfachen JPG-datei enthalten sind.
//edit: zu spät 
_________________ Patrick
im zweifelsfall immer das richtige tun!!!
|
|
Nemo 
      
Beiträge: 26
Win 2000/WinXP
D7 Prof
|
Verfasst: Mo 28.02.05 12:21
So bin so frei mir selbst eine Antwort zu geben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button2Click(Sender: TObject); var tempJpeg: TJPEGImage; begin tempJpeg := TJPEGImage.Create; tempJpeg.Scale := jsEighth; tempJpeg.LoadFromFile('C:\temp.jpg'); tempJpeg.DIBNeeded; Image2.Picture.Assign(tempJpeg); end; |
Nicht nur die Qualität ist dann geachtelt, sondern auch die Ladezeit
16eln würde mir auch reichen, gibts wohl aber nicht
Aus reiner Neugier, wie ginge es denn mit stretchblt?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mo 28.02.05 12:24
Ich weiss dass man zusätzliche Informationen drin speichern kann (Datum z.B.), aber eine Option für n Thumbnail kannte ich bisher nicht. Kenne auch kein Programm, welches sowas unterstützt.
//Edit: Hmm, offenbar wird das von PSP und Photoshop unterstützt.. Wusste ich nicht.
Zuletzt bearbeitet von delfiphan am Mo 28.02.05 12:27, insgesamt 1-mal bearbeitet
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 28.02.05 12:24
ich mach das eben mal, dauert 5 mins muss kein anderer machen sonst gibs gleich wieder 2 lösungen ^^
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var tempJpeg: TJPEGImage; bmp: tbitmap; begin tempJpeg := TJPEGImage.Create; tempJpeg.LoadFromFile('C:\benbe.jpg'); bmp := tbitmap.Create; bmp.Width := tempjpeg.Width; bmp.Height := tempjpeg.Height; bmp.Assign(tempjpeg); stretchblt(bmp.Canvas.Handle,0,0,bmp.width div 4 ,bmp.height div 4, bmp.Canvas.Handle,0,0,bmp.width,bmp.height,srccopy); bmp.Width := bmp.Width div 4; bmp.height := bmp.Height div 4; form1.Canvas.Draw(0,0,bmp); bmp.free; tempJpeg.free; |
|
|
Nemo 
      
Beiträge: 26
Win 2000/WinXP
D7 Prof
|
Verfasst: Mo 28.02.05 13:02
@uall@ogc
Zeit das zu testen hatte ich noch nicht, aber das kann meines Wissens nicht funktionieren, weil:
bmp.Assign(tempjpeg);
Ja jener Schritt ist, der bei 3600px Bildern an die 5 Sekunden dauert. Egal ob dargestellt oder nicht.
Habe mich Zeile für Zeile durch mein altes Programm gewunden bis ich da drauf gekommen bin, aber Irrtum nicht ausgeschlossen...
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mo 28.02.05 13:08
also der code von nemo funzt zigmal schneller als der von uall ^^
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 28.02.05 13:25
hm kay dafür kanner da net die enaue breite angeben ;>
aber ich schau nochmal
jsFullSize Zeigt die Grafik in voller Größe an.
jsHalf Zeigt die Grafik in halber Göße, dafür aber in doppelter Geschwindigkeit an.
jsQuarter Zeigt die Grafik in einem Viertel der maximalen Größe, dafür aber viermal so schnell an.
jsEighth Zeigt die Grafik in einem Achtel der maximalen Größe, dafür aber achtmal so schnell an.
naja wenn man das bisl kombiniert kanste danna uch diengröße machen die du haben willst :>
|
|
Nemo 
      
Beiträge: 26
Win 2000/WinXP
D7 Prof
|
Verfasst: Mo 28.02.05 14:19
Hey, keine schlechte Idee. Allerdings ist mir nicht ganz klar wie ich die Faktoren multiplizieren kann.
tempJpeg.Scale := jsEighth+jsHalf;
geht ja eher nicht. Gibts da eine Möglichkeit?
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 28.02.05 14:33
Das kann man nicht kombinieren. Das ist ja schließlich kein Set und würde auch keinen Sinn machen. Scale kann nur EINEN der Werte annehmen.
Ich weiß zwar auch nicht wozu du das genau brauchst. Aber evtl besteht ja die Möglichkeit, dass du offline ein kleines Vorschaubild erzeugst? Ich befürchte allerdings nicht.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 28.02.05 14:35
nimm meinte methode mach dann aus dem DIV 16 ne DIV 2 und mach vorher scaled = 8 dann haste das genau so schnell nur halt 1/16
|
|
Lossy eX
      
Beiträge: 1048
Erhaltene Danke: 4
|
Verfasst: Mo 28.02.05 14:39
Habe noch etwas gefunden.
Ein TJPEGImage unterstützt auch noch eine Eigenschaft Performance. Einfach mal vor dem Laden auf jpBestSpeed stellen. Habe ich in der Delphihilfe gefunden!! Unteranderem stand da auch noch was von der Eigenschaft Smoothing. Dadurch wird das Bild beim laden geglättet. Das Dauer auch wieder.
_________________ Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
|
|
Nemo 
      
Beiträge: 26
Win 2000/WinXP
D7 Prof
|
Verfasst: Mo 28.02.05 15:10
Performance allein ist schon recht schnell, aber ca. 3 mal langsamer als die Scale Variante. Das Ergebnis sähe optisch aber besser aus. Wers mal ausprobieren will:
www.kirtagsmusi.at/temp/preview.zip
(Programm inkl. Delphi 7 Projektdateien 256kb, Ein Jpeg Bild auf C:\temp.jpg sollte vorhanden und etwa 3MB groß sein)
So denke ich, das Scale jsEighth reichen sollte.
Nur ein kleiner Schönheitsfehler bleibt noch, vielleicht kennt da gerade jemand eine Antwort:
Ich lade nun 10 Bilder in bekannter Weise in 10 TImage Komponenten. Wirklich anzeigen tut er sie aber erst nachdem alle 10 geladen sind. Würde natürlich besser aussehen und für Kurzweil sorgen, wenn er sie auch gleich anzeigen würde. Ich schätze mal, dass das Programm wärend der Schleife ausgelastet ist und die Bilder deshalb nicht anzeigen kann. Sleep war nur so eine Idee, hat aber nicht geklappt. Vorschläge?
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 28.02.05 15:29
application.processmessage
|
|
Nemo 
      
Beiträge: 26
Win 2000/WinXP
D7 Prof
|
Verfasst: Di 01.03.05 10:52
Funktioniert nun tadellos. Vielen Dank nochmal an alle Helferlein!
|
|