Ich habe mir eine Prozedur gebastelt, die u.a. mittels BitmapContent.Pokeline den Inhalt einer BitmapContent in eine .BMP-Datei schreibt, da ich eine solche Funktion sonst nirgends gefunden habe. Nun mein Problem:
Alles funktioniert prima, solange im BitmapContent nicht Farben über Farbcode 127 vorkommen. Dann gibt mir Pokeline falsche Werte im Bereich der zu 'hohen' Pixel aus. Ich habe einmal ein Testbild mit angehangen, welches die Problematik gut wiedergibt.
Die falschen Werte sind übrigens immer &HFF und &H7F
Das paradoxe daran: In der View, welche das BitmapContent darstellt, ist die Grafik ohne Makel - Alle Farben werden korrekt dargestellt.
Bilder, die nur Farben unter 128 verwenden werden ebenfalls korrekt dargestellt.
Ist das eventuell ein Fehler in PokeLine?
Mario
DECL FUNCTION MakeBMP(str_file AS STRING, bmp_Content AS Object) AS INTEGER
STRUCT BMPheader
'Ident AS STRING(2) ' "BM"
Magic AS INTEGER 'Workaround fr BM
Size AS LONGINT ' file size (x*y+header+pal)
Reserved AS LONGINT ' junk
Offset AS LONGINT ' header+palette
HeaderSize AS LONGINT ' 40
xRes AS LONGINT ' x resolution
yRes AS LONGINT ' y resolution
Planes AS INTEGER ' 1
i_BPP AS INTEGER ' bits per pixel
Compression AS LONGINT ' 0-none/1,2-rle
ImageSize AS LONGINT ' x*y
PixPerMetreX AS LONGINT ' 3790
PixPerMetreY AS LONGINT ' 3780
UsedColors AS LONGINT
ImportantColors AS LONGINT
END STRUCT
STRUCT BMPpalEntry
bl, gr, rd, nl AS Byte
End Struct
STRUCT BMPpxDWord
il, ih AS Integer
End Struct
FUNCTION MakeBMP(str_file AS STRING, bmp_Content AS Object) AS INTEGER
' *** MakeBMP ***
' speichert den Inhalt eines BitmapContent-Objektes inkl.
' einer ggf. modifizierten Palette als .BMP-Datei ab.
'
' str_file = Dateiname der Zieldatei inkl. Pfad (ohne Pfad = aktueller Pfad)
' bmp_Content = BitmapContent-Objekt aus welchem gelesen werden soll
DIM MyBMPheader AS BMPheader
DIM BMPfile AS FILE
DIM pal AS FullPalette
DIM BMPpalE AS BMPpalEntry
DIM dw AS BMPpxDWord
DIM ic, ix, iy AS INTEGER
DIm i_xStart, i_yStart, i_xEnd, i_yEnd AS INTEGER
i_xStart = 0
i_yStart = 0
i_xEnd = bmp_Content.bitmapFormat(0) - 1
i_yEnd = bmp_Content.bitmapFormat(1) - 1
MyBMPheader.xRes = i_xEnd - i_xStart + 1
MyBMPheader.yRes = i_yEnd - i_yStart + 1
'MyBMPheader.Ident = "BM"
MyBMPheader.Magic = 19778 'Workaround fr 'BM'
MyBMPheader.Size = MyBMPheader.xRes * MyBMPheader.yRes + 54 + 4 * 2 ^ 8
MyBMPheader.Reserved = 0
MyBMPheader.Offset = 54 + 4 * 2 ^ 8
MyBMPheader.HeaderSize = 40
MyBMPheader.Planes = 1
MyBMPheader.i_BPP = 8
MyBMPheader.Compression = 0
MyBMPheader.ImageSize = MyBMPheader.xRes * MyBMPheader.yRes
MyBMPheader.PixPerMetreX = 3790
MyBMPheader.PixPerMetreY = 3780
MyBMPheader.UsedColors = 0
MyBMPheader.ImportantColors = 0
BMPfile = filecreate (str_file, "")
IF fileError <> 0 THEN RETURN FAlse
'Kopfdaten schreiben
FileWrite BMPfile, MyBMPheader, sizeOf(BMPheader)
'Palettendaten schreiben
pal = bmp_Content.GetFullPalette
FOR ic = 0 TO 255
BMPpalE.rd = pal.item[ic].rt
BMPpalE.gr = pal.item[ic].gn
BMPpalE.bl = pal.item[ic].bl
FileWrite BMPfile, BMPpalE, sizeof(BMPpalE)
NEXT
'Bilddaten schreiben
'Achtung!:
'Zeilendaten mssen durch 4 teilbar sein, sonst mssen sie aufgefllt werden!
'Pokeline fllt hier aber anscheinend selbst schon Nullen auf?
FOR iy = i_yEnd TO i_yStart STEP -1
bmp_Content.PokeLine 0, iy
FOR ix = i_xStart TO i_xEnd STEP 4
dw.il = Deek(ix)
dw.ih = Deek(ix+2)
FileWrite BMPfile, dw, 4
NEXT
NEXT
FileCLOSE BMPfile
RETURN TRUE
END FUNCTION
Display More