Seite 1 von 2

Größe aus JPEG/PNG Datei auslesen

Verfasst: 07.03.2006 19:33
von KeyKon
Wie geht das?
Ich möchte die Größe (Pixel) des Bildes auslesen ohne die gesammte Datei einlesen zu müssen, wo stehen also die entsprechenden Werte in der JPEG/PNG Datei?

KeyKon

Verfasst: 07.03.2006 19:46
von sen-me
du musst sie warscheinlich mit loadimage schon einlesen dann imagewidth und imagehight benutzen

Verfasst: 07.03.2006 19:50
von KeyKon
Naja, das muss doch irgendwie auch anders gehen, ich möchte so wenig Zeit/Byte wie möglich brauchen damit das bei vielen Bildern nicht lange dauert...

KeyKon

Verfasst: 07.03.2006 20:03
von Kiffi
> Naja, das muss doch irgendwie auch anders gehen

ja, geht auch anders. Ich habe vor Urzeiten eine Routine gefunden, die nur
ein paar Bytes aus dem Header der Datei liest. Ist leider in VB, lässt sich
aber meines Erachtens relativ leicht in PB umsetzen:

http://www.freevbcode.com/ShowCode.Asp?ID=112

Grüße ... Kiffi

Verfasst: 07.03.2006 20:34
von KeyKon
Danke, ich denke das hilft mir weiter!

KeyKon

Verfasst: 07.03.2006 22:01
von KeyKon
Ich hab von VB keinen Schimmer deswegen mal die Frage:
Was bedeutet der Befehl Mult(Zahl,Zahl)
EDIT: ^^ :oops: hab übersehen das das ne eigene Prozedure ist...
Was aber bedeutet der Befehl CLng(Zahl)?

KeyKon

Verfasst: 09.03.2006 00:29
von Falko
http://www.vbarchiv.net/commands/CLng.php

Ist sogesehen ein einfaches Long, würde ich sagen.

Verfasst: 09.03.2006 14:55
von KeyKon
Ich glaub nich das der VB-Code von Kiffi funktioniert, zumindest funzt meine umsetzung bis jetzt nur mit JPEGs die ich mit IView gespeichert habe, vielleicht hab ich aber auch irgendeinen Fehler rein. Könnte sich das mal einer Anschauen:

Code: Alles auswählen

Dim Buffer.w(3)

path$ = OpenFileRequester("JPEG öffnen...","","JPEG|*.jpg;*.jpeg|All|*.*",0)

vor1 = ElapsedMilliseconds()

If ReadFile(0,path$) = 0
  Debug "Konnte nicht öffnen1"
  End
EndIf

BUFFERSIZE = Lof()


Buffer(0) = ReadByte()+256
Buffer(1) = ReadByte()+256
Buffer(2) = ReadByte()+256

Repeat
    
  If (Buffer(0) = $FF And Buffer(1) = $D8 And Buffer(2) = $FF)
    Break
  ElseIf Loc() >= BUFFERSIZE-10
    End
  EndIf
  
  Buffer(0) = Buffer(1)
  Buffer(1) = Buffer(2)
  Buffer(2) = ReadByte()+256
  
ForEver

Buffer(0) = ReadByte()+256
Buffer(1) = ReadByte()+256

Repeat
  Repeat
    If Buffer(0) = $FF And Buffer(1) <> $FF
      Break
    ElseIf Loc() >= BUFFERSIZE-10
      End
    EndIf
    
    Buffer(0) = Buffer(1)
    Buffer(1) = ReadByte()+256
    
  ForEver
  
  Buffer(0) = Buffer(1)
  
  If Buffer(0) = $C0 Or Buffer(0) = $C1 Or Buffer(0) = $C2 Or Buffer(0) = $C3 Or Buffer(0) = $C5 Or Buffer(0) = $C6 Or Buffer(0) = $C7 Or Buffer(0) = $C9 Or Buffer(0) = $CA Or Buffer(0) = $CB Or Buffer(0) = $CD Or Buffer(0) = $CE Or Buffer(0) = $CF
    Debug Hex(Buffer(0)-256)
    Break
  ElseIf Loc() >= BUFFERSIZE-10
    End
  EndIf
  
  Buffer(1) = ReadByte()+256
  
ForEver


FileSeek(Loc()+3)
Buffer(0) = ReadByte()
Buffer(1) = ReadByte()
Buffer(2) = ReadByte()
Buffer(3) = ReadByte()


h1 = (Buffer(1)) + (Buffer(0)*256)
w1 = (Buffer(3)) + (Buffer(2)*256)
d1 = ReadByte()*8

CloseFile(0)

nach1 = ElapsedMilliseconds()





UseJPEGImageDecoder()


vor2 = ElapsedMilliseconds()

If LoadImage(0,path$) = 0
  Debug "Konnte nicht öffnen2"
  End
EndIf

h2 = ImageHeight()
w2 = ImageWidth()
d2 = ImageDepth()

FreeImage(0)

nach2 = ElapsedMilliseconds()


Debug path$
Debug "1: "+Str(w1)+"x"+Str(h1)+"x"+Str(d1)+"  -  "+Str(nach1-vor1)+" ms"
Debug "2: "+Str(w2)+"x"+Str(h2)+"x"+Str(d2)+"  -  "+Str(nach2-vor2)+" ms"
Ich hab da jetzt noch nen Geschwindigkeitsvergleich dabei, aber der mischt da ja nich rein...

KeyKon

Verfasst: 09.03.2006 14:59
von Kiffi
> Ich glaub nich das der VB-Code von Kiffi funktioniert,

1. Zuviel der Ehre, aber der Code ist nicht von mir :-)

2. Der Code funktioniert in der VB-Version sehr wohl, denn er läuft seit
mehreren Monaten klaglos in einer Software, die täglich mehrere tausend
Bilder verarbeitet. Da muss also irgendwas mit Deiner Konvertierung nicht
stimmen. :wink:

Grüße ... Kiffi

Verfasst: 09.03.2006 15:06
von KeyKon
Was für Bilder werden denn verwaltet? Fotos direkt aus der Kamera oder von einem Programm erstellte Bilder?

KeyKon