A pure Java 8 implementation of
.
This library has no runtime dependencies, including Java AWT. ImageIO/BufferedImage support is provided using separate module
.
Performance
On average, when using qoi-java-awt as an ImageIO plugin, QOI can encode 7 times faster than PNG with default settings and decode 2 times faster, while having 15% less size than PNG.
To get maximum performance, you can skip ImageIO and use pixel data arrays directly.
See full results in
.
Before choosing or rejecting QOI for your project, it is recommended to run benchmarks yourself with appropriate sample files.
used to produce above results.
How to Use
Add as a dependency
This library is available in Maven Central.
Maven
<dependency> <groupId>me.saharnooby</groupId> <artifactId>qoi-java</artifactId> <version>1.2.1</version> </dependency> <!-- Also add this, if you want to use QOI with ImageIO --> <dependency> <groupId>me.saharnooby</groupId> <artifactId>qoi-java-awt</artifactId> <version>1.2.1</version> </dependency>Gradle
dependencies { implementation 'me.saharnooby:qoi-java:1.2.1'// Also add this, if you want to use QOI with ImageIO implementation 'me.saharnooby:qoi-java-awt:1.2.1' }Other build systems
You can download prebuilt JARs from
or build them yourself.
Usage
Use methods in class me.saharnooby.qoi.QOIUtil:
// Read image from a fileQOIImageimage = QOIUtil.readFile(newFile("image.qoi")); System.out.println("Image size: " + image.getWidth() + " x " + image.getHeight()); // Access pixel dataSystem.out.println("Red channel is " + image.getPixelData()[0]); // Create new 1x1 RGBA image from raw pixel databyte[] pixelData = {(byte) 255, 127, 0, (byte) 255}; QOIImageorangeImage = QOIUtil.createFromPixelData(pixelData, 1, 1, 4); // Write image to a fileQOIUtil.writeImage(orangeImage, newFile("orange.qoi"));Usage with ImageIO
To use QOI with ImageIO, you need to also add
dependency. It provides an
, which installs automatically using
.
To read and write QOI images, use standard ImageIO methods:
// Read QOI image from a fileBufferedImageimage = ImageIO.read(newFile("image.qoi")); Objects.requireNonNull(image, "Invalid QOI image"); // Write QOI image into a fileif (!ImageIO.write(image, "QOI", newFile("copy.qoi"))) { thrownewIllegalStateException("Image type is not supported"); }To convert QOI images into BufferedImages and back, use methods in class me.saharnooby.qoi.QOIUtilAWT:
// Convert PNG to QOIBufferedImageimage = ImageIO.read(newFile("image.png")); QOIImageqoi = QOIUtilAWT.createFromBufferedImage(image); QOIUtil.writeImage(qoi, newFile("image.qoi")); // Convert QOI to PNGQOIImagesecondImage = QOIUtil.readFile(newFile("second-image.qoi")); BufferedImageconvertedImage = QOIUtilAWT.convertToBufferedImage(secondImage); ImageIO.write(convertedImage, "PNG", newFile("second-image.png"));Building
You will need Git, Maven and JDK 8 or higher.
git clone https://github.com/saharNooby/qoi-java.git cd qoi-java mvn clean installCompatibility
No AWT classes are used, so it should be compatible with Android. Please report compatibility issues, if they arise.
Versioning
This project uses semantic versioning.