A PureBasic include-only image plugin to support the QOI (Quite OK Image) format. The QoiImagePlugin.pbi file is the only file from this repository you need to incorporate the QOI format in your projects. All you need to do is XIncludeFile "QoiImagePlugin.pbi"
and enable the decoder and/or encoder with UseQOIImageDecoder()
and/or UseQOIImageEncoder()
.
The decoder and encoder could have been a lot more optimized by writing a user library in C or C++. Unfortunately, that would mean a user library would have to be released for every PureBasic compiler version I want to support. Especially now the new C-backend is becoming available, the include-only solution seems to be the most viable for support on multiple versions and platforms.
Currently, there is no inline assembly in the include for the same reasoning; support for x86, x86-64, ARM on all supported operating systems would mean custom inline assembly/inline C per compiler.
If someone wants to contribute to the repository with optimized code for each platform, I would be happy to merge it in.
First enable the decoder at the earliest stage of your project's code.
UseQOIImageDecoder() ; Enable decoder
Then use the PureBasic image library like you normally would.
hImage1 = LoadImage(#PB_Any, "dice.qoi")
hImage2 = CatchImage(#PB_Any, ?qoiDataLabel, ?qoiDataLabelEnd - ?qoiDataLabel)
First enable the encoder at the earliest stage of your project's code.
UseQOIImageEncoder() ; Enable encoder
Then use the PureBasic image library like you normally would. You can use the image format flag #PB_ImagePlugin_QOI
to save an image as QOI. Only 24-bit and 32-bit modes are enabled.
; Save any input image as QOI.
; Remember to enable the appropriate decoders for the input types
; Remember to enable the QOI encoder.
Procedure.i ConvertToQoi(input.s, output.s)
Protected hInput = LoadImage(#PB_Any, input)
If (Not hInput)
ProcedureReturn #False
EndIf
Protected result = SaveImage(hInput, output, #PB_ImagePlugin_QOI)
FreeImage(hInput)
ProcedureReturn result
EndProcedure
; Save any input image as QOI exported buffer.
; Remember to enable the appropriate decoders for the input types
; Remember to enable the QOI encoder.
Procedure.i ConvertToQoiBuffer(input.s)
Protected hInput = LoadImage(#PB_Any, input)
If (Not hInput)
ProcedureReturn #False
EndIf
protected *result = EncodeImage(hInput, #PB_ImagePlugin_QOI)
FreeImage(hInput)
ProcedureReturn *result
EndProcedure
Currently there is a rudimentary test file Test.pb
which does some conversion testing between formats. In one phase, a directory named test
in the same parent as Test.pb
will be scanned for images and they will be converted, then decoded and the results will be compared to the original.
Another phase generates a couple of random images and performs similar testing.
There is also a Viewer.pb
that contains a UI application for opening any supported image format (All PB formats + QOI). This application allows you to save any opened image as QOI as well.
There might be issues in the encoder or decoder, let me know about them through GitHub issues or through Twitter @BGroothedde.