Ich drücke auf F5, es kommt ein IMA bevor ich das Compilerfenster sehe und aus. Das komische ist das ich mir sicher bin das der Code vor 2 Stunden bevor ich im Training war funktioniert hat und ich seit dem nichts geändert habe?Der Compiler scheint abgestürzt oder unerwartet beendet worden zu sein.
Er wird neu gestartet.
Bitte melden Sie die Umstände, welchen diesen Programmfehler verursachten.
PS:
Compiler - Optionen:
XP - Skin
Code: Alles auswählen
EnableExplicit
Structure _BMPPixel
Green.c
Red.c
Blue.c
EndStructure
Structure _ColorTableEntry
Entry.l[0]
EndStructure
Structure _RGBMasks
Green.l
Red.l
Blue.l
EndStructure
Structure _Bitmap
FileHeader.BITMAPFILEHEADER
InfoHeader.BITMAPINFOHEADER
RGBMask._RGBMasks
*BMPData
BMPDataSize.i
*ColorTable._ColorTableEntry
EndStructure
Prototype BMP_FilterCB(*Pixel._BMPPixel)
; BMP - Laden
Procedure BMP_Load(File$)
Protected hFile, *BMP._Bitmap, TableSize
With *BMP
hFile = ReadFile(#PB_Any, File$)
If hFile
*BMP = AllocateMemory(SizeOf(_Bitmap))
; Header laden
ReadData(hFile, @\FileHeader, SizeOf(BITMAPFILEHEADER))
ReadData(hFile, @\InfoHeader, SizeOf(BITMAPINFOHEADER))
; RGB - Masken laden
If \InfoHeader\biCompression = #BI_bitfields
ReadData(hFile, @\RGBMask, SizeOf(_RGBMasks))
EndIf
; Farbtabelle laden
If \InfoHeader\biClrUsed Or (\InfoHeader\biBitCount = 1) Or(\InfoHeader\biBitCount = 4) Or (\InfoHeader\biBitCount = 8) ; Farbtabelle (Bei 4 oder 8 ist 0 = max)
If Not \InfoHeader\biClrUsed ; Maximum
TableSize = Pow(2, \InfoHeader\biBitCount)
Else
TableSize = \InfoHeader\biClrUsed*SizeOf(Long)
EndIf
\ColorTable = AllocateMemory(TableSize)
ReadData(hFile, \ColorTable, TableSize)
EndIf
; Rohdaten laden
FileSeek(hFile, \FileHeader\bfOffBits)
If \FileHeader\bfOffBits
\BMPDataSize = Lof(hFile)-\FileHeader\bfOffBits
\BMPData = AllocateMemory(\BMPDataSize)
ReadData(hFile, \BMPData, \BMPDataSize)
EndIf
CloseFile(hFile)
ProcedureReturn *BMP
EndIf
EndWith
EndProcedure
; BMP - Speichern
Procedure BMP_Save(*BMP._Bitmap, FileName$)
Protected hFile
With *BMP
hFile = CreateFile(#PB_Any, FileName$)
If hFile
; Header Speichern
WriteData(hFile, @\FileHeader, SizeOf(BITMAPFILEHEADER))
WriteData(hFile, @\InfoHeader, SizeOf(BITMAPINFOHEADER))
; RGB Masken speichern
If \InfoHeader\biCompression = #BI_bitfields
ReadData(hFile, @\RGBMask, SizeOf(_RGBMasks))
EndIf
; Farbtabelle speichern
If \InfoHeader\biClrUsed
WriteData(hFile, \ColorTable, \InfoHeader\biClrUsed*SizeOf(Long))
EndIf
; Rohdaten speichern
FileSeek(hFile, \FileHeader\bfOffBits)
If \BMPData
WriteData(hFile, \BMPData, \BMPDataSize)
EndIf
CloseFile(hFile)
ProcedureReturn #True
EndIf
EndWith
EndProcedure
; Bitmapdaten kopieren
Procedure BMP_Copy(*BMP._Bitmap)
Protected *NewBMP._Bitmap
*NewBMP = AllocateMemory(SizeOf(_Bitmap))
; Copy BMP Data
With *BMP
*NewBMP\FileHeader = \FileHeader
*NewBMP\InfoHeader = \InfoHeader
*NewBMP\RGBMask = \RGBMask
If \BMPData
*NewBMP\BMPDataSize = \BMPDataSize
*NewBMP\BMPData = AllocateMemory(\BMPDataSize)
CopyMemory(\BMPData, *NewBMP\BMPData, \BMPDataSize)
EndIf
If \ColorTable
*NewBMP\ColorTable = AllocateMemory(\InfoHeader\biClrUsed*SizeOf(Long))
CopyMemory(\ColorTable, *NewBMP\ColorTable, \InfoHeader\biClrUsed*SizeOf(Long))
EndIf
ProcedureReturn *NewBMP
EndWith
EndProcedure
; BMP - Freigeben
Procedure BMP_Free(*BMP._Bitmap)
With *BMP
If \BMPData
FreeMemory(\BMPData)
EndIf
If \ColorTable
FreeMemory(\ColorTable)
EndIf
FreeMemory(*BMP)
EndWith
EndProcedure
Procedure BMP_Filter(*BMP._Bitmap, *CB.BMP_FilterCB)
Protected row, col, pattern, *Pixel._BMPPixel, width, height
With *BMP
Select \InfoHeader\biBitCount
Case 1, 4, 8
Case 16
Case 24
Select \InfoHeader\biCompression
Case #BI_bitfields
; Ungebräuchlich
Case #BI_RGB
pattern = \InfoHeader\biWidth%4 ; Füllpattern
height = \InfoHeader\biHeight
width = \InfoHeader\biWidth
*Pixel = \BMPData
For row = 1 To height
For col = 1 To width
; # + (3*width + pattern)*(height-row) + (col*3) + 1
*CB(*Pixel)
*Pixel + SizeOf(_BMPPixel)
Next
*Pixel + pattern
Next
Case #BI_RLE8, #BI_RLE4
; Ungebräuchlich
EndSelect
Case 32
EndSelect
EndWith
EndProcedure
Procedure BMP_ConvertTo24Bit(*BMP._Bitmap)
Protected *Pixel._BMPPixel, *p8Pixel._BMPPixel, *p8PixelEntry
Protected pattern, height, width, row, col
With *BMP
Select \InfoHeader\biBitCount
Case 1
; Noch zu erledigen
Case 4
; Noch zu erledigen
Case 8
pattern = \InfoHeader\biWidth%4 ; Füllpattern
height = \InfoHeader\biHeight
width = \InfoHeader\biWidth
*p8PixelEntry = \BMPData
*Pixel = AllocateMemory(width*height*3)
Select \InfoHeader\biCompression
Case #BI_bitfields
; Ungebräuchlich
Case #BI_RGB
; Umrechnen von 8 auf 24 Bit
For row = 1 To height
For col = 1 To width
; Wert aus der Farbtabelle holen
*p8Pixel = \ColorTable\Entry[PeekC(*p8PixelEntry)]
; Wert direkt eintragen
*Pixel\Red = *p8Pixel\Red
*Pixel\Green = *p8Pixel\Green
*Pixel\Blue = *p8Pixel\Blue
; Weiterzählen
*p8PixelEntry + SizeOf(Byte)
*Pixel + SizeOf(_BMPPixel)
Next
; Pattern
*p8PixelEntry + pattern
*Pixel + pattern
Next
; Farbtable entfernen, offset ändern
\FileHeader\bfOffBits-(\InfoHeader\biClrUsed*SizeOf(Long))
If \ColorTable
FreeMemory(\ColorTable)
EndIf
\InfoHeader\biClrUsed = #Null
\InfoHeader\biClrImportant = #Null
\ColorTable = #Null
; Daten wechseln
FreeMemory(\BMPData)
\BMPData = *Pixel
; Neue Größe schreiben
\BMPDataSize = width*height*3
\InfoHeader\biSizeImage = \BMPDataSize
; Format - Infos ändern
\InfoHeader\biBitCount = 24
\InfoHeader\biCompression = #BI_RGB
Case #BI_RLE8, #BI_RLE4
; Ungebräuchlich
EndSelect
Case 16
; Ungebrächlich, ev. noch erledigen
Case 24
; Unnötig
Case 32
; Ungebrächlich, ev. noch erledigen
EndSelect
EndWith
EndProcedure