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: ^^

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.
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