Seite 1 von 1

Bildformate, herausfinden, wie sie geladen werden müssen ...

Verfasst: 14.05.2007 18:05
von Xaby
Hallo Fans,

Gibt es eine Möglichkeit, diese Sache irgendwie besser anzustellen?:

Code: Alles auswählen

UseJPEGImageDecoder()
UsePNGImageDecoder()
;UseTGAImageDecoder()
;UseTIFFImageDecoder()

Procedure IsImageFileExtension(S.s)
  E.s=UCase(GetExtensionPart(S))
  If E="JPG" Or E="JPEG" Or E="PNG" Or E="BMP" Or E="ICO"; Or E="TGA" Or E="TIF" or E="TIFF"
    ProcedureReturn 1
  Else  
    ProcedureReturn 0
  EndIf
  
EndProcedure
Eventeuell würde man ja sonst eine Textdatei versuchen mittels

Code: Alles auswählen

LoadImage(#Image, S)
zu laden. Und danach muss man schauen, wie das Resultat ist.
Klar, können auch Bilder die Endung *.TXT haben.

Aber was ist, wenn es kein Bild ist? Will man Text laden, wird man ja auch schlecht erstmal alles laden können.
Oder sollte man alles, was nicht mit dem LoadImage-Befehl funktioniert als Textdatei laden? Ich glaube nicht :?


Aber auch wenn man einen

Code: Alles auswählen

OpenFileRequester(...)
benutzt und dort ewig die *.Bildformate angeben muss ...

gibt es da nicht irgendeine einfachere Variante?

Klar, man könnte sich eine Liste basteln, wo die Endungen alle aufgeführt sind und die Liste dann laden oder so. ...

Aber ob das das beste ist ...

Wie seht ihr die Sache, was fällt euch dazu ein. Oder umgeht ihr das Problem? Wenn ja, wie?


Header-Tester wären cool.
Vielleicht eine UserLib, die ich mal wieder übersehen habe?


Dank euch, Gruß, Folker :allright:

Verfasst: 17.05.2007 11:30
von Xaby
Na Jungs, keine eine Idee?

Hab jetzt auch endlich herausgefunden, dass man GIF Bilder wie Videos behandeln muss.

Darauf muss man erstmal kommen, steht ja nicht in der PB-Hilfe.

Ich befürchte halt nur, dass wenn ich folgendes mache:

Code: Alles auswählen

If LoadImage(#Media, Datei)=0
  If LoadMovie(#Media, Datei)=0

  ...
 EndIf
EndIf

Code: Alles auswählen

If LoadImage(#Media, Datei)<>0

ElseIf LoadMovie(#Media, Datei)<>0

ElseIf ...
  ...
EndIf


Das es einfach zu lange dauert, wenn erstmal alle möglichen PlugIns ihr Glück versuchen. Was weiß ich, es gibt doch sicherlich über 1.000 verschiedene Dateiformate.

Gut, nun muss ich ja nicht alle berücksichten.

Aber einen GetHeaderInfo Procedure wäre doch nicht schlecht.
Man liest die Ersten 128 Zeichen der entsprechenden Datei aus und überprüft für welches Format die Datei hat und als Rückgabewert könnte eine eindeutige PlugInID herauskommen.

Dann kann man sich die Endung sparen.
Gibt es unter Linux und MacOS überhaupt Endungen?

Kennt sich jemand mit Headern und Dateiformaten aus oder funktioniert es in PB eigentlich schon so, dass sich die PlugIns gegenseitig ,,helfen,,?
:?

Vielen Dank für eure Unterstützung :allright:

Verfasst: 17.05.2007 11:35
von ChristianK
Jedes Bildformatdatei hat einen bestimmten Header. Den brauchst du nur abfragen,

Guck mal z.B.hier: http://www.fh-wedel.de/~bek/c/praktika/ ... 2.html#gif

ander e Formate findest du überall im iNet

http://de.wikipedia.org/wiki/Jpg#Dateiformat
http://de.wikipedia.org/wiki/Bmp#Dateikopf

usw.

Verfasst: 17.05.2007 12:10
von Xaby
Mmmm, ich merk schon. Die Arbeit nimmt mir keiner ab.

Vielleicht reichen ja auch die ersten 5 Byte.
Gut bei AVIs steht da wohl RIFF drin oder sowas.

Aber dann weiß man ja auch, dass man es mit LoadMovie laden kann.

Zu den GIFs. Eigentlich will ich nur ein Gif auf einfache Art in ein ImageGadget laden.

Gibt es da nicht eine einfachere Variante als erst als Movie das zu laden und dann irgendwie mit Verrenkungen über Sprites ein Bild auf ein Image zu rendern?
:freak:

Verfasst: 17.05.2007 12:28
von ChristianK
>>Aber einen GetHeaderInfo Procedure wäre doch nicht schlecht.

Das wäre doch eine reizvolle Aufgabe für dich oder? Einfach den Filename übergeben und das Resultat ist eine Kennung für das Bildformat oder keines.
"Fakes" sollten in gewissen Grenzen auch erkannt werden. Auf gehts! Zeit: 15min. :wink:

Verfasst: 17.05.2007 12:51
von Kaeru Gaman
Xaby hat geschrieben:Mmmm, ich merk schon. Die Arbeit nimmt mir keiner ab.
...warum sollte jemand dir arbeit abnehmen?
wie CK schrieb: auf gehts.
schreib uns ne schöner GetHeaderInfo.
Xaby hat geschrieben:Zu den GIFs. Eigentlich will ich nur ein Gif auf einfache Art in ein ImageGadget laden.

Gibt es da nicht eine einfachere Variante als erst als Movie das zu laden und dann irgendwie mit Verrenkungen über Sprites ein Bild auf ein Image zu rendern?
:freak:
natürlich geht das.
du musst dir eine laderoutine schreiben, die den GIF-algorithmus beinhaltet,
die ein leeres image erzeugt in der größe wie sie im GIF-header drinsteht,
und die dann die bilddaten dekomprimiert und in das image packt,
natürlich unter nutzung der im GIF integrierten farbpalette.
wenn es ein animiertes gif ist, geht das natürlich nicht so einfach.


also ernsthaft:
wozu gif?

das hat eigentlich nur eine berechtigung, wenn du ein allgemeingültiges tool schreiben willst, mit dem man auf unterschiedlichste bildformate zugreifen kann.

wenn du nur in programme, die einem anderen zweck dienen, bilder oder animationen integrieren willst, wähle andere formate.

Verfasst: 17.05.2007 12:56
von ts-soft
Animierte GIFs lassen sich einfacher in einem WebGadget abspielen. Bleibt
auch die Exe kleiner falls man nicht noch sonstwo die Movie Lib benötigt.

Verfasst: 17.05.2007 13:07
von Leonhard
Hier ist mal ein Beispiel (nur GIF und BMP wird erkannt):

Code: Alles auswählen

Enumeration
  #FileType_Unknow = 0
  
  #FileType_BMP
  #FileType_GIF
EndEnumeration

#FileType_Image = %1<<16

Procedure.l GetFileType(iFile.l)
  Protected *Sig.byte = AllocateMemory(3)
  ReadData(iFile, *Sig, 3)
  
  ;/ Überprüfe Datei-Signatur
  
  If PeekS(*Sig, 2, #PB_Ascii) = "BM"
    lReturn = #FileType_BMP | #FileType_Image
  ElseIf PeekS(*Sig, 3, #PB_Ascii) = "GIF"
    lReturn = #FileType_GIF | #FileType_Image
  EndIf
  
  ProcedureReturn lReturn
EndProcedure
Procedure.s GetFileTypeString(lFileType.l)
  Protected sReturn.s
  
  If lFileType & #FileType_Image
    sReturn = "Image/Bild/Icon: "
    lFileType ! #FileType_Image
  EndIf
  
  Select lFileType
    Case #FileType_BMP
      sReturn + "Bitmap"
    Case #FileType_GIF
      sReturn + "GIF"
    Default
      sReturn + "unbekannt"
  EndSelect
  
  ProcedureReturn sReturn
EndProcedure

Define File$ = OpenFileRequester("", "", "*.*", 1)
If FileSize(File$) >= 0
  If ReadFile(1, File$)
    Debug GetFileTypeString(GetFileType(1))
    
    CloseFile(1)
  EndIf
EndIf

End