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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

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

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag 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.
ChristianK for President
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag 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:
ChristianK for President
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag 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
Antworten