wie über imagereader die echte bildbreite+höhe ermitteln?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

wie über imagereader die echte bildbreite+höhe ermitteln?

Beitrag von Leberecht »

hallo,

hatte probleme mit dem performaten laden grösserer bilder (von kameras, so 3000x2000 pixel, ca. 3mb) was immer mind. 2 sekunden dauerte. habe dann aufgrund dieses forenposts:
http://lazarus.freepascal.org/index.php?topic=13429.0" onclick="window.open(this.href);return false;

meinen code auf die verwendung von den fpc-imagereadern umgestellt. im beispiel einer .jpg-datei sieht das ganze dann so aus:

Code: Alles auswählen

myImage  :=  TFPMemoryImage.create(0, 0);
  myImgReader := TFPReaderJPEG.Create;
  myImage.UsePalette := False;
  myImgReader.Performance:=jpBestSpeed;
  myImgReader.Scale:=jsEighth;
  myImage.LoadFromFile(sDateiname, myImgReader);
  imgBildvorschau.Picture.Assign(myImage);
  myImage.Free;
  myImgReader.Free;
das ganze geht auch gut und schnell, nur bin ich nicht mehr in der lage, die echten bilddimensionen zu erhalten. wenn ich die über myImage.width bzw. height abfrage,
kommen nur die verkleinerten werte. auf die idee diese werte mit dem divisor, welcher in myImgReader.Scale benutzt wurde(hier 8) zu multiplizieren, kam ich auch schon,
das dürfte aber nur mit bildern funktionieren, welche exakt durch 8 bzw. den entsprechenden divisor teilbar sind. bei z.b. ungraden breiten stimmen die errechneten angaben
auf keinen fall mit den echten überein.

gibt es irgenteinen weg, die echten bilddimensionen zu ermitteln, ohne den geschwindigkeitsvorteil wieder zu verlieren? und kann ich das ganze dann auch mit .png, .gif und all den anderen bildformaten machen?

edit:
irgentwie scheint das ganze (beschleunigtes laden) nur mit der jpeg-reader klasse zu funktionieren, nicht aber mit den anderen readern(png, bmp, gif).
gibt es irgenteine lösung, unter lazarus ein bild schnell in ein image-objekt zu laden und gleichzeitig die echten bilddimensionen zu erfahren?
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: wie über imagereader die echte bildbreite+höhe ermitteln?

Beitrag von theo »

Leberecht hat geschrieben: gibt es irgenteinen weg, die echten bilddimensionen zu ermitteln, ohne den geschwindigkeitsvorteil wieder zu verlieren? und kann ich das ganze dann auch mit .png, .gif und all den anderen bildformaten machen?
Am einfachsten noch mal extra den Header auslesen. Geht schnell:
http://www.swissdelphicenter.ch/de/showcode.php?id=1698" onclick="window.open(this.href);return false;


Leberecht hat geschrieben: irgentwie scheint das ganze (beschleunigtes laden) nur mit der jpeg-reader klasse zu funktionieren, nicht aber mit den anderen readern(png, bmp, gif).
gibt es irgenteine lösung, unter lazarus ein bild schnell in ein image-objekt zu laden und gleichzeitig die echten bilddimensionen zu erfahren?
Den JPEG Scaling Code habe ich selber beigetragen
Für die anderen Formate ist das afaik nicht möglich.

Leberecht
Beiträge: 73
Registriert: Fr 28. Mai 2010, 08:39
OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
CPU-Target: 32Bit
Wohnort: Heidelberg

Re: wie über imagereader die echte bildbreite+höhe ermitteln?

Beitrag von Leberecht »

ja ok. hab mir schon gedacht das es mit den anderen formaten nicht geht. benutze jetzt imagemagicks kommandozeilentools für den job.
indentify ist da extrem geil, kann alles in sekundenbruchteilen auslesen, auch z.b. anzahl bilder bei animierten gif´s.und mit convert
skaliere ich die bilder vorm laden ins lazarus-image runter und lege sie im bmp-format ab. da hat er dann am wenigsten zu rechnen.
ist geschwindigkeitsmässig zwar nicht so schnell wie delphi, aber trotzdem mind. doppelt so schnell über lazarus direkt.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: wie über imagereader die echte bildbreite+höhe ermitteln?

Beitrag von theo »

Vielleicht kannst du mal mit meinem Thumbcontrol vergleichen. Das benutzt nur Bordmittel. Evtl. Property Multithreaded auf True setzen.
http://www.lazarusforum.de/viewtopic.ph ... 29&p=38990" onclick="window.open(this.href);return false;

Antworten