Seite 1 von 1
Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 14:23
von SilverSurfer
Hallo Leute,
Ich würde gerne wissen, wie ich herraus finde, ob eine Bilddatei einen Alphakanal besitzt, bevor ich die Datei lade. Hintergrund ist, das der Nutzer eine Bilddatei wählen kann und ich wissen muss, ob ich das Spreite dann mit Alpha, oder normal laden muss....
LG SilverSurfer
Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 15:01
von NicTheQuick
Ich würde Bilder immer mit Alphakanal laden. Dann sind sie nach dem Laden immer gleich im Speicher aufgebaut. Das macht das Handling doch viel einfacher. Oder versuchst du damit Arbeitsspeicher zu sparen?
Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 15:07
von Sven
Du kannst auch normale Bilddateien mit DrawAlphaImage auf ein Sprite zeichnen.
Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 16:55
von SilverSurfer
Stimmt, das kann ich alles, ich dachte es macht einen Unterschied bei der Anzeige. Vielen Dank....
Aber trotzdem muss man das doch anhand irgendwelcher Merkmale im Dateiheader oder so raus finden können. Ich sage mal so, wichtig wäre es dann trotzdem, wenn man das Bild wieder zurück speichern will.....
Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 17:37
von NicTheQuick
Du kannst dir die Dateiheader für die verschiedenen Formate anschauen. Und wenn es nur um PNG-Dateien geht, dann habe ich gerade mal was für dich programmiert.
Code: Alles auswählen
Procedure.l B2LEndian32(long.l)
ProcedureReturn (long >> 24) | ((long >> 8) & $ff00) | ((long & $ff00) << 8) | (long & $ff) << 24
EndProcedure
Procedure hasAlphaChannal(file.s)
Protected fileId.i, chunkSize.i, w.i, h, bits, type
fileId = ReadFile(#PB_Any, file)
If Not fileId
ProcedureReturn -1
EndIf
If (ReadQuad(fileId) <> $0a1a0a0d474e5089)
; This is not a PNG file
ProcedureReturn -1
EndIf
chunkSize = B2LEndian32(ReadLong(fileId)) & $ffffffff
If (ReadLong(fileId) <> $52444849)
; Wrong Chunk
ProcedureReturn -1
EndIf
w = B2LEndian32(ReadLong(fileId))
h = B2LEndian32(ReadLong(fileId))
bits = ReadAsciiCharacter(fileId)
type = ReadAsciiCharacter(fileId)
CloseFile(fileId)
If (type = 4 Or type = 6)
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Debug hasAlphaChannal("mitAlpha.png")
Debug hasAlphaChannal("ohneAlpha.png")
Es gibt eine 1 aus, wenn ein Alpha-Kanal drin ist und 0, wenn keiner drin ist. War das Dateiformat falsch oder konnte die Datei nicht geöffnet werden, wird einen -1 zurückgegeben.
Informationen dazu hab ich übrigens von
Portable Network Graphics -> File header und
PNG (Portable Network Graphics) Specification, Version 1.2 -> IHDR Image header.
Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 17:43
von SilverSurfer
OHA....vielen Dank. Hab gar nicht gedacht dass so ein Aufwand ist....danke dir für deine Mühe....
Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt
Verfasst: 11.08.2015 18:13
von NicTheQuick
Hier ist eine kürzere Version ohne Fehlerüberprüfung:
Code: Alles auswählen
Procedure hasAlphaChannal2(file.s)
Protected fileId.i = ReadFile(#PB_Any, file), result.i = -1
If (fileId)
FileSeek(fileId, $19)
result = ReadAsciiCharacter(fileId)
result = Bool(result = 4 Or result = 6)
CloseFile(fileId)
EndIf
ProcedureReturn result
EndProcedure