Pixmap im bmp-Format speichern

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Hubsi

Betreff: Pixmap im bmp-Format speichern

BeitragDi, Jan 10, 2017 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin gerade dabei ein kleines Helferchen-Programm für mich zu schreiben und suche verzweifelt eine Funktion welche es mir erlaubt ein Bild das ich vom Backbuffer in eine Pixmap kopiert habe als bmp zu speichern. Hintergrund ist das eine Reihe Einzelbilder einen anderen Farbton bekommen sollen. Soweit mit BMax ja kein Problem, nur eben wie gesagt das speichern Smile Sowas wie einen ImageBuffer wie in BlitzBasic mit SaveImage gibt es ja nicht mehr? Oder auch eine andere Lösung wenn ich da was nicht im Augenwinkel haben sollte? Smile
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Lador

BeitragDi, Jan 10, 2017 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Hubsi,

es gibt SavePixmapPNG() und SavePixmapJPeg(), aber für Bitmaps gibt es keinen offiziellen Source Code. Hab auf die Schnelle diese Diskussion im Englischen Forum gefunden, die auf eine Seite mit inoffizieller Funktion SavePixmapBMP() verlinkt (s. unten, zweiter link):

http://www.blitzmax.com/Commun...opic=65262
http://www.blitzbasic.com/Comm...036#603668 (Beitrag unten von JoshK)

Hab es jetzt aber nicht getestet. Hoffe, ich konnte dir weiterhelfen.

MFG Lador
Mein aktuelles Projekt:
2D-Rollenspiel "Iliran"
Screenshot | Worklog
Fortschritt: ca. 70%

count-doku

BeitragDi, Jan 10, 2017 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

da das Bitmap Format recht einfach gehalten ist (siehe auch Wikipedia) sollte es auch nicht so schwierig sein,
einen Code zu schreiben der aus dem der Pixmap zugrunde liegenden MemoryBank eine Bitmap macht.

Hatte sowas mal in BB geschrieben, vllt. hilft dir das:

BlitzBasic: [AUSKLAPPEN]
Type BMP_TImg
;Wichtig
Field bank
Field breite,hoehe
Field xpixm,ypixm
Field bps
;Zusatzinfos
Field FlaechenZahl
Field Kompression
Field usedColors
Field importantColors
End Type

Function BMP_Laden.BMP_TImg(Dateiname$)
; Prüfen ob die Datei existiert
If Dateiname = "" Then Return Null

Local stream = ReadFile(Dateiname)
If Not stream Then RuntimeError "Bilddatei nicht gefunden!"

; Header und Dataheader lesen
If ReadByte(stream)<>66 Then RuntimeError "Keine BMP Datei!"
If ReadByte(stream)<>77 Then RuntimeError "Keine BMP Datei!"
;2 Byte

Local BMP_Img.BMP_TImg=New BMP_TImg

ReadInt(stream);Dateigrösse
ReadInt(stream);Reserved
ReadInt(stream);BMPstart
ReadInt(stream);InfoHeadergroesse
BMP_Img\breite=ReadInt(stream);breite
BMP_Img\hoehe=ReadInt(stream);höhe
;26 Byte
BMP_Img\FlaechenZahl=ReadShort(stream);FlaechenAnzahl
BMP_Img\bps=ReadShort(stream);BitsPerPixel
;30 Byte
BMP_Img\Kompression=ReadInt(stream);Kompression
ReadInt(stream);BMP Datenzahl
BMP_Img\xpixm=ReadInt(stream);XPixelProMeter
BMP_Img\ypixm=ReadInt(stream);YPixelProMeter
BMP_Img\usedColors=ReadInt(stream);anzahl gebrauchter Farben
BMP_Img\importantColors=ReadInt(stream);anzahl wichtiger Farben
;54 Byte

BMP_Img\bank=CreateBank(BMP_Img\breite*BMP_Img\hoehe*3)

; Bilddaten einlesen
For i= 0 To (BMP_Img\breite*BMP_Img\hoehe*3)-1
PokeByte BMP_Img\bank,i, ReadByte (stream)
Next
Return BMP_Img.BMP_TImg
End Function
Function BMP_Zeichnen (BMP_Img.BMP_TImg,VerschiebungX=0,VerschiebungY=0)
i=0
LockBuffer BackBuffer()
For y =BMP_Img\hoehe-1 To 0 Step -1
For X=0 To BMP_Img\breite-1
b = PeekByte (BMP_Img\bank,i)
i=i+1
g = PeekByte (BMP_Img\bank,i)
i=i+1
r = PeekByte (BMP_Img\bank,i)
i=i+1

rgb=a*$1000000 + r*$10000 + g*$100 + b
WritePixelFast X+VerschiebungX,Y+VerschiebungY,rgb, BackBuffer()
Next
Next
UnlockBuffer BackBuffer()
End Function
Function BMP_Speichern (BMP_Img.BMP_TImg,Pfad$="img.bmp")
Stream = WriteFile (Pfad)

; Header und Dataheader schreiben
WriteByte Stream,66 ;Asci-code für B
WriteByte Stream,77 ;Asci-code für M, BM = Dateikennung

;2 Byte
WriteInt Stream,BMP_Img\breite*BMP_Img\hoehe*3+54 ;Dateigrösse
WriteInt Stream,0;Reserved
WriteInt Stream,54;BMPstart
WriteInt Stream,40 ;InfoHeadergrösse
WriteInt Stream,BMP_Img\breite;Bitmapbreite
WriteInt Stream,BMP_Img\hoehe ;Bitmaphoehe
;26 Byte
WriteShort Stream,BMP_Img\FlaechenZahl;FlaechenAnzahl
WriteShort Stream,BMP_Img\bps;BitsProPixel
;30 Byte
WriteInt Stream,BMP_Img\Kompression ;Kompression
WriteInt Stream,BMP_Img\breite*BMP_Img\hoehe*3 ;BMPDatenanzahl
WriteInt Stream,BMP_Img\xpixm;XPixelProMeter
WriteInt Stream,BMP_Img\ypixm;YPixelProMeter
WriteInt Stream,BMP_Img\usedColors ;AnzahlgebrauchterFarben
WriteInt Stream,BMP_Img\importantColors;AnzahlWichtigerFarben
;54 Byte

;Bilddaten schreiben
For i = 0 To (BMP_Img\breite*BMP_Img\hoehe*3)-1
WriteByte Stream,PeekByte(BMP_Img\bank,i)
Next

CloseFile Stream
End Function
Function BMP_Loeschen(BMP_Img.BMP_TImg)
FreeBank BMP_Img\bank
Delete BMP_Img.BMP_TImg
Return True
End Function


lg,
Count-Doku

DAK

BeitragMi, Jan 11, 2017 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es einen besonderen Grund, warum es bmp sein muss und nicht png?
Gewinner der 6. und der 68. BlitzCodeCompo

Hubsi

BeitragMi, Jan 11, 2017 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Tausend Dank erstmal, werd die Funktion testen Very Happy

Der Grund für bmp ist das alle Tiles bisher in bmp gemacht wurden und ich bei einer Umstellung auf png ich rund 140 Dateien umspeichern müsste. Ob das besonders schlau war bei den Vorüberlegungen zum Projekt zu ignorieren sei mal dahin gestellt Very Happy Wobei mir bei dem Geschreibe gerade der Gedanke kommt das man auch das leicht automatisieren könnte...
Schadet aber auch nix sich näher mit dem Format zu befassen, nochmal danke für die schnelle Hilfe Very Happy

Edit: Funktioniert klasse, der Tag ist gerettet Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Xeres

Moderator

BeitragMi, Jan 11, 2017 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst 140 Dateien ändern, wenn du eine andere Dateiendung verwenden willst?
Das ist das abstruseste, was ich je gehört habe. Konstanten oder Konfigurationsdateien jetzt einbauen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

DAK

BeitragMi, Jan 11, 2017 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, er meint, wenn er alle von BMP auf PNG umändern will, dann muss er das alles machen.

Aber es passt ja zum Thema. Einfach ein kleines Programm machen, dass alle BMPs lädt und als PNGs speichert.
Gewinner der 6. und der 68. BlitzCodeCompo

Hubsi

BeitragDo, Jan 12, 2017 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Gedanken von DAK hatte ich auch, aber Xeres hat schon recht Embarassed LoadImage lädt ja das Format in dem Datei vorliegt. Unabhängig davon ob die Endung "stimmt". Manchmal mach ichs mir echt zu kompliziert Mr. Green
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Holzchopf

Meisterpacker

BeitragFr, Jan 13, 2017 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hubsi hat Folgendes geschrieben:
LoadImage lädt ja das Format in dem Datei vorliegt. Unabhängig davon ob die Endung "stimmt"

Das verwirrt mich jetzt Confused Wo liegt das Problem darin, alle .bmp Dateien in PNGs umzuwandeln und als .png zu speichern und als .png zu laden?

Wenn du dir kein Tool schreiben willst, was BMP lädt und PNG ausspuckt:
IrfanView bietet Batch Conversion an. D.h. du gibst einen Ordner an, in dem es alle Dateien einlesen soll, einen Ausgabeordner und ein Ausgabedateiformat, drückst auf Start und schon hast du alle BMPs als PNG

MfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Hubsi

BeitragFr, Jan 13, 2017 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Problem liegt nicht mehr vor. Zu Anfang des Threads hatte ich schlichtweg ein dickes Brett vorm Kopf, was sich durch die viele Hilfe ziemlich rasant abmontieren ließ. Manchmal denk ich viel zu sehr um die Ecke, aber ich arbeite dran Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group