GIF Dateien Erstellen od. Speichern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

GIF Dateien Erstellen od. Speichern

Beitrag von Pelagio »

Hallo,

ich habe mich ein wenig mit GIF-Dateien beschäftigt und kann diese auch anzeigen lassen und auch Änderungen vornehmen.
Allerdings nur im Arbeitsspeicher. Ich habe keinen Befehl in PB gefunden mit der ich eine bspw. geänderte GIF-Datei abspeichern kann
und auch wenn ich mehrer Bilder bzw. PNG-Dateien habe und diese als GIF zusammenfassen wollte, konnte keine Möglichkeiten bei PB finden.
Besteht überhaupt die Möglichkeit unter PB GIF-Dateien zu erstellen, speichern? :praise:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: GIF Dateien Erstellen od. Speichern

Beitrag von Derren »

Nein. PB hat keinen Gif-Support. Weder kannst du die Dateien laden, noch anzeigen, noch speichern.
Du musst externe Bibliotheken verwenden, oder selbst Funktionen schreiben. Aber wenn du die Daten bereits im Arbeitsspeicher manipulieren kannst, musst du sie doch nur noch ganz normal in eine Datei schreiben. Ggf. noch einen Header vorne dran etc und fertig.
Signatur und so
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: GIF Dateien Erstellen od. Speichern

Beitrag von Demivec »

Derren hat geschrieben:Nein. PB hat keinen Gif-Support. Weder kannst du die Dateien laden, noch anzeigen, noch speichern.
Mit UseGIFImageDecoder du kannst laden.
Bild
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: GIF Dateien Erstellen od. Speichern

Beitrag von Pelagio »

Genau Demivec,

deswegen konnte ich auch die Datei manipulieren.
Jetzt fehlt mir nur noch die Möglichkeit diese Manipulation auch zu speichern
und damit stehe ich auf dem Schlauch.......
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

Re: GIF Dateien Erstellen od. Speichern

Beitrag von DePe »

Es gibt auch das ImagePlugin von wilbert im englischen Forum:
https://www.purebasic.fr/english/viewto ... 12&t=66497

Ich verwende es unter Windows, und es funktioniert ohne Probleme.

Peter
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: GIF Dateien Erstellen od. Speichern

Beitrag von Pelagio »

Hallo,

vielen Dank für die interessanten Beiträge aber die Beispiele sind mir einfach zu unübersichtlich und so habe ich mich entschlossen, vorerst jedenfalls, die manipulierte GIF-Datei mit dem Programm GIF-X zu erstellen. Vorab aber zerlege ich eine GIF-Datei in Ihre verschiedenen Frame, ändere diese und speichere jeden Frame als PNG-Datei extra ab. Diese Bilder setze ich mit dem GIF-X Programm wieder als GIF-Datei zusammen. Anbei wollte ich jedenfalls Euch an meinem Source teilhaben lassen falls jemand doch noch einmal etwas ähnliches braucht. Man sollte ja auch einmal etwas zurückgeben.

Code: Alles auswählen

; GIF-Manipulation
; auf bestehende GIF's
;~~~~~~~~~~~~~~~~~~~~~~

EnableExplicit

UseGIFImageDecoder()
UsePNGImageEncoder()

Enumeration
	#mainWindows
	#mainCanvas
	#mainTimer
	#mainImage
	#mainFont
EndEnumeration

#gifFile = "GIF-Original.gif"
#NewText = "Test"

Procedure GIF_originalViewer(vFrame.i=#PB_Any)
	Protected pEvent.i, pFrame.i, pZaehler.i, pValue.s = Left(#NewText, 1)
	Protected pFont.i = LoadFont(#mainFont, "Curier New", 60)

	If LoadImage(#mainImage, #gifFile)
		If OpenWindow(#mainWindows, 100, 100, ImageWidth(#mainImage), ImageHeight(#mainImage), "GIF viewer")
			CanvasGadget(#mainCanvas, 0, 0, ImageWidth(#mainImage), ImageHeight(#mainImage))
			AddWindowTimer(#mainWindows, #mainTimer, 1)
			If (vFrame<#False): vFrame = ImageFrameCount(#mainImage) + 1: EndIf
			Repeat
				pEvent = WaitWindowEvent()
				If pEvent = #PB_Event_Timer
					SetImageFrame(#mainImage, pFrame)
					RemoveWindowTimer(#mainWindows, #mainTimer)
					AddWindowTimer(#mainWindows, #mainTimer, GetImageFrameDelay(#mainImage))
					If StartDrawing(CanvasOutput(#mainCanvas))
						DrawImage(ImageID(#mainImage), 0, 0)
						If (pFrame>vFrame)
							DrawingFont(pFont)
							DrawingMode(#PB_2DDrawing_Transparent)
							DrawText(120, 0, pValue)
							pZaehler + 1
						EndIf
						Select pZaehler
							Case  5: pValue + Mid(#NewText, 2, 1)
							Case 10: pValue + Mid(#NewText, 3, 1)
							Case 15: pValue + Mid(#NewText, 4, 1)
						EndSelect
						StopDrawing()
					EndIf
					pFrame + 1
					If (pFrame=ImageFrameCount(#mainImage))
						pFrame = 0: pZaehler = 0: pValue = Left(#NewText, 1)
					EndIf
				EndIf
			Until (pEvent = #PB_Event_CloseWindow)
			CloseWindow(#mainWindows)
		EndIf
	Else
		Debug "Kann die Datei nicht laden: " + #gifFile
	EndIf
EndProcedure

Procedure GIF_Save()
	Protected pValue.s, pFrame.i, pMax.i = (ImageFrameCount(#mainImage) - 1)

	For pFrame=0 To pMax
		SetImageFrame(#mainImage, pFrame)
		pValue = Str(GetImageFrameDelay(#mainImage))+ "-Frame" + RSet(Str(pFrame), 2, "0") + ".png"
		SaveImage(#mainImage, pValue, #PB_ImagePlugin_PNG)
	Next
EndProcedure

Procedure GIF_Viewer(vFlag.a)
	Protected pEvent.i, pFrame.i, pFont.i, pZaehler.i

	If OpenWindow(#mainWindows, 100, 100, ImageWidth(#mainImage), ImageHeight(#mainImage), "GIF viewer")
		CanvasGadget(#mainCanvas, 0, 0, ImageWidth(#mainImage), ImageHeight(#mainImage))
		AddWindowTimer(#mainWindows, #mainTimer, 1)
		Repeat
			pEvent = WaitWindowEvent()
			If pEvent = #PB_Event_Timer
				SetImageFrame(#mainImage, pFrame)
				RemoveWindowTimer(#mainWindows, #mainTimer)
				AddWindowTimer(#mainWindows, #mainTimer, GetImageFrameDelay(#mainImage))
				If StartDrawing(CanvasOutput(#mainCanvas))
					DrawImage(ImageID(#mainImage), 0, 0)
					StopDrawing()
				EndIf
				pFrame+1
				If (pFrame>=ImageFrameCount(#mainImage))
					pFrame = 0: pZaehler = 0
					If vFlag: Break: EndIf
				EndIf
			EndIf
		Until (pEvent = #PB_Event_CloseWindow)
		CloseWindow(#mainWindows)
	Else
		Debug "Kann die Datei nicht laden: " + #gifFile
	EndIf
EndProcedure

Procedure GIF_testViewer(vFrame.i=#PB_Any, vSave.a = #False)
	Protected pEvent.i, pFrame.i, pZaehler.i, pValue.s = Left(#NewText, 1)
	Protected pFont.i = LoadFont(#mainFont, "Curier New", 60)

	If LoadImage(#mainImage, #gifFile)
		If (vFrame<#False): vFrame = ImageFrameCount(#mainImage) + 1: EndIf
		Repeat
			SetImageFrame(#mainImage, pFrame)
			If StartDrawing(ImageOutput(#mainImage))
				If (pFrame>vFrame)
					DrawingFont(pFont)
					DrawingMode(#PB_2DDrawing_Transparent)
					DrawText(120, 0, pValue)
					pZaehler + 1
				EndIf
				Select pZaehler
					Case  5: pValue + Mid(#NewText, 2, 1)
					Case 10: pValue + Mid(#NewText, 3, 1)
					Case 15: pValue + Mid(#NewText, 4, 1)
				EndSelect
				StopDrawing()
			EndIf
			pFrame + 1
			If (pFrame=ImageFrameCount(#mainImage)): Break: EndIf
		ForEver
		GIF_Viewer(vSave)
		If vSave: GIF_Save(): EndIf
	Else
		Debug "Kann die Datei nicht laden: " + #gifFile
	EndIf
EndProcedure

;GIF_originalViewer(15)
GIF_testViewer(15) ;, #True)

MessageRequester("InfoBox", "Programmende", #MB_ICONINFORMATION)

End
Zur INFO: Die Test GIF-Datei hatte 37 Frame.
Viel Spaß :bounce:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Antworten