init
This commit is contained in:
commit
ecfaf41f91
5 changed files with 783 additions and 0 deletions
203
include/imgout.bm
Normal file
203
include/imgout.bm
Normal file
|
|
@ -0,0 +1,203 @@
|
|||
|
||||
Sub SaveBinaryPPM (imageHandle As Long, fileName As String)
|
||||
Dim r As _Unsigned _Byte
|
||||
Dim g As _Unsigned _Byte
|
||||
Dim b As _Unsigned _Byte
|
||||
Dim fileHandle As Integer
|
||||
Dim w As _Unsigned Long
|
||||
Dim h As _Unsigned Long
|
||||
Dim head As String
|
||||
Dim fileout As String
|
||||
Dim image As _MEM
|
||||
Dim filebuffer As _MEM
|
||||
Dim inPosition As _Offset
|
||||
Dim outPosition As _Offset
|
||||
Dim length As _Offset
|
||||
image = _MemImage(imageHandle)
|
||||
inPosition = image.OFFSET
|
||||
w = _Width(imageHandle)
|
||||
h = _Height(imageHandle)
|
||||
length = inPosition + w * h * 4
|
||||
head = "P6" + Chr$(10)
|
||||
head = head + "# Created with QB64" + Chr$(10)
|
||||
head = head + LTrim$(Str$(w) + Str$(h)) + Chr$(10)
|
||||
head = head + "255" + Chr$(10)
|
||||
filebuffer = _MemNew(w * h * 3)
|
||||
outPosition = filebuffer.OFFSET
|
||||
Do
|
||||
b = _MemGet(image, inPosition, _Unsigned _Byte)
|
||||
g = _MemGet(image, inPosition + 1, _Unsigned _Byte)
|
||||
r = _MemGet(image, inPosition + 2, _Unsigned _Byte)
|
||||
_MemPut filebuffer, outPosition, r As _UNSIGNED _BYTE
|
||||
_MemPut filebuffer, outPosition + 1, g As _UNSIGNED _BYTE
|
||||
_MemPut filebuffer, outPosition + 2, b As _UNSIGNED _BYTE
|
||||
inPosition = inPosition + 4
|
||||
outPosition = outPosition + 3
|
||||
Loop Until inPosition = length
|
||||
fileout = Space$(w * h * 3)
|
||||
_MemGet filebuffer, filebuffer.OFFSET, fileout
|
||||
fileHandle = FreeFile
|
||||
Open fileName For Binary As fileHandle
|
||||
Put fileHandle, , head
|
||||
Put fileHandle, , fileout
|
||||
Close fileHandle
|
||||
_MemFree image
|
||||
_MemFree filebuffer
|
||||
End Sub
|
||||
|
||||
Sub save24bitBmp (imageHandle As Long, fileName As String)
|
||||
Dim oSource As Long
|
||||
Dim ff As Long
|
||||
Dim x As Long, y As Long
|
||||
Dim header As String * 54
|
||||
Dim outBytes As String * 3
|
||||
Dim padding As String
|
||||
oSource = _Source
|
||||
_Source imageHandle
|
||||
|
||||
header = "BM" + MKL$(_Width * _Height * 3 + 54) +_
|
||||
String$(4, 0) + MKL$(54) + MKL$(40) +_
|
||||
MKL$(_Width) + MKL$(_Height) +_
|
||||
MKI$(1) + MKI$(24) + MKL$(0) + MKL$(0) +_
|
||||
MKL$(11811) + MKL$(11811) + MKL$(0) + MKL$(0)
|
||||
|
||||
If ((_Width * 3) Mod 4) Then padding$ = String$(4 - ((_width * 3) Mod 4), 0)
|
||||
|
||||
ff = FreeFile
|
||||
Open fileName For Binary As ff
|
||||
Put ff, , header
|
||||
For y = _Height - 1 To 0 Step -1
|
||||
For x = 0 To _Width - 1
|
||||
outBytes = Left$(MKL$(Point(x, y)), 3)
|
||||
Put #ff, , outBytes
|
||||
Next
|
||||
put #ff, , padding
|
||||
Next
|
||||
Close ff
|
||||
_Source oSource
|
||||
End Sub
|
||||
|
||||
Sub save8bitPNG (imagehandle As Long, filename As String)
|
||||
Dim PngHeader As String
|
||||
Dim IHDR As String
|
||||
Dim IDAT As String
|
||||
Dim IEND As String
|
||||
Dim PLTE As String
|
||||
Dim x As _Unsigned Long, y As _Unsigned Long
|
||||
Dim colorvalue As _Unsigned Long
|
||||
Dim chunksize As String
|
||||
Dim ff As Long
|
||||
Dim imageData As String
|
||||
dim sourceMem as _mem
|
||||
dim c As _Unsigned _byte
|
||||
sourceMem = _memimage(imagehandle)
|
||||
PngHeader = chr$(137) + "PNG" + Chr$(13) + Chr$(10) + Chr$(26) + Chr$(10)
|
||||
IHDR = "IHDR" + MKL$(FlipBytes(_Width(imagehandle))) + MKL$(FlipBytes(_Height(imagehandle))) + Chr$(8) + Chr$(3) + String$(3, 0)
|
||||
IHDR = MKL$(FlipBytes(&H0D)) + IHDR + MKL$(FlipBytes(crc32(IHDR)))
|
||||
IEND = MKL$(0) + "IEND" + MKL$(FlipBytes(&HAE426082))
|
||||
PLTE = "PLTE"
|
||||
for c = 0 to 255
|
||||
PLTE = PLTE + chr$(_Red32(_PaletteColor(c)))
|
||||
PLTE = PLTE + chr$(_Green32(_PaletteColor(c)))
|
||||
PLTE = PLTE + chr$(_Blue32(_PaletteColor(c)))
|
||||
Next
|
||||
PLTE = mkl$(FlipBytes(256 * 3)) + PLTE + MKL$(FlipBytes(crc32(PLTE)))
|
||||
|
||||
imageData = string$(_Height(imagehandle) * _Width(imagehandle) + _Height(imagehandle), 0)
|
||||
|
||||
For y = 0 To _Height(imagehandle) - 1
|
||||
For x = 0 To _Width(imagehandle) - 1
|
||||
c = _memget(sourceMem, sourceMem.OFFSET + bytecount + 0, _Unsigned _byte)
|
||||
asc(imageData,bytecount + y + 2) = c
|
||||
bytecount = bytecount + 1
|
||||
Next x
|
||||
Next y
|
||||
_memfree sourceMem
|
||||
IDAT = _Deflate$(imageData)
|
||||
chunksize = MKL$(FlipBytes(Len(IDAT)))
|
||||
IDAT = "IDAT" + IDAT
|
||||
IDAT = IDAT + MKL$(FlipBytes(crc32(IDAT)))
|
||||
IDAT = chunksize + IDAT
|
||||
ff = FreeFile
|
||||
Open filename For Output As ff: Close ff
|
||||
Open filename For Binary As ff
|
||||
Put ff, , PngHeader
|
||||
Put ff, , IHDR
|
||||
put ff, , PLTE
|
||||
Put ff, , IDAT
|
||||
Put ff, , IEND
|
||||
Close ff
|
||||
End Sub
|
||||
|
||||
Sub save32bitPNG (imagehandle As Long, filename As String)
|
||||
Dim PngHeader As String
|
||||
Dim IHDR As String
|
||||
Dim IDAT As String
|
||||
Dim IEND As String
|
||||
Dim x As _Unsigned Long, y As _Unsigned Long
|
||||
Dim colorvalue As _Unsigned Long
|
||||
Dim chunksize As String
|
||||
Dim ff As Long
|
||||
Dim imageData As String
|
||||
dim sourceMem as _mem
|
||||
dim as _Unsigned _byte r, g, b
|
||||
sourceMem = _memimage(imagehandle)
|
||||
PngHeader = chr$(137) + "PNG" + Chr$(13) + Chr$(10) + Chr$(26) + Chr$(10)
|
||||
IHDR = "IHDR" + MKL$(FlipBytes(_Width(imagehandle))) + MKL$(FlipBytes(_Height(imagehandle))) + Chr$(8) + Chr$(6) + String$(3, 0)
|
||||
IHDR = MKL$(FlipBytes(&H0D)) + IHDR + MKL$(FlipBytes(crc32(IHDR)))
|
||||
IEND = MKL$(0) + "IEND" + MKL$(FlipBytes(&HAE426082))
|
||||
imageData = string$(_Height(imagehandle) * _Width(imagehandle) * 4 + _Height(imagehandle), 0)
|
||||
|
||||
For y = 0 To _Height(imagehandle) - 1
|
||||
For x = 0 To _Width(imagehandle) - 1
|
||||
b = _memget(sourceMem, sourceMem.OFFSET + bytecount + 0, _Unsigned _byte)
|
||||
g = _memget(sourceMem, sourceMem.OFFSET + bytecount + 1, _Unsigned _byte)
|
||||
r = _memget(sourceMem, sourceMem.OFFSET + bytecount + 2, _Unsigned _byte)
|
||||
a = _memget(sourceMem, sourceMem.OFFSET + bytecount + 3, _Unsigned _byte)
|
||||
|
||||
asc(imageData,bytecount + y + 2) = r
|
||||
asc(imageData,bytecount + y + 3) = g
|
||||
asc(imageData,bytecount + y + 4) = b
|
||||
asc(imageData,bytecount + y + 5) = a
|
||||
bytecount = bytecount + 4
|
||||
Next x
|
||||
Next y
|
||||
_memfree sourceMem
|
||||
IDAT = _Deflate$(imageData)
|
||||
chunksize = MKL$(FlipBytes(Len(IDAT)))
|
||||
IDAT = "IDAT" + IDAT
|
||||
IDAT = IDAT + MKL$(FlipBytes(crc32(IDAT)))
|
||||
IDAT = chunksize + IDAT
|
||||
ff = FreeFile
|
||||
Open filename For Output As ff: Close ff
|
||||
Open filename For Binary As ff
|
||||
Put ff, , PngHeader
|
||||
Put ff, , IHDR
|
||||
Put ff, , IDAT
|
||||
Put ff, , IEND
|
||||
Close ff
|
||||
End Sub
|
||||
|
||||
Function FlipBytes~& (value As _Unsigned Long)
|
||||
FlipBytes~& = (value \ 16777216)_
|
||||
Or (value * 16777216)_
|
||||
Or ((value And 16711680) \ 256)_
|
||||
Or ((value And 65280) * 256)
|
||||
End Function
|
||||
|
||||
Function crc32~& (IN$)
|
||||
Dim As _Unsigned Long CRC32_POLY, CRC
|
||||
CRC32_POLY = &HEDB88320
|
||||
CRC = &HFFFFFFFF
|
||||
For I = 1 To Len(IN$)
|
||||
CRC = CRC Xor Asc(IN$, I)
|
||||
For J = 1 To 8
|
||||
If CRC And 1 Then
|
||||
CRC = (CRC \ 2) Xor CRC32_POLY
|
||||
Else
|
||||
CRC = CRC \ 2
|
||||
End If
|
||||
Next J
|
||||
Next I
|
||||
crc32~& = Not CRC
|
||||
End Function
|
||||
Loading…
Add table
Add a link
Reference in a new issue