Prüfen ob eine Bilddatei einen Alphakanal besitzt

Für allgemeine Fragen zur Programmierung mit PureBasic.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Prüfen ob eine Bilddatei einen Alphakanal besitzt

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt

Beitrag 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?
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt

Beitrag von Sven »

Du kannst auch normale Bilddateien mit DrawAlphaImage auf ein Sprite zeichnen.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt

Beitrag 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.....
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt

Beitrag 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.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt

Beitrag von SilverSurfer »

OHA....vielen Dank. Hab gar nicht gedacht dass so ein Aufwand ist....danke dir für deine Mühe....
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Prüfen ob eine Bilddatei einen Alphakanal besitzt

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