Autor Beitrag
Nemo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26

Win 2000/WinXP
D7 Prof
BeitragVerfasst: 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.

:idea: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 28.02.05 12:04 
In jedem JPG eine Vorschau? Ne, das wäre ja total unsinnig!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 534



BeitragVerfasst: Mo 28.02.05 12:19 
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: 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 :D

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Nemo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26

Win 2000/WinXP
D7 Prof
BeitragVerfasst: Mo 28.02.05 12:21 
So bin so frei mir selbst eine Antwort zu geben:

ausblenden 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 :lol:
16eln würde mir auch reichen, gibts wohl aber nicht :roll:

Aus reiner Neugier, wie ginge es denn mit stretchblt?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 ^^

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26

Win 2000/WinXP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Mo 28.02.05 13:08 
also der code von nemo funzt zigmal schneller als der von uall ^^
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26

Win 2000/WinXP
D7 Prof
BeitragVerfasst: 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; :lol:

geht ja eher nicht. Gibts da eine Möglichkeit?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26

Win 2000/WinXP
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 28.02.05 15:29 
application.processmessage
Nemo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 26

Win 2000/WinXP
D7 Prof
BeitragVerfasst: Di 01.03.05 10:52 
Funktioniert nun tadellos. Vielen Dank nochmal an alle Helferlein!