Compare commits

..

No commits in common. "main" and "v0.1.1" have entirely different histories.
main ... v0.1.1

16 changed files with 8 additions and 27 deletions

View file

@ -6,7 +6,7 @@ The squishiest image format!
repository = "https://github.com/Dangoware/sqp" repository = "https://github.com/Dangoware/sqp"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
authors = ["G2 <ke0bhogsg@gmail.com>"] authors = ["G2 <ke0bhogsg@gmail.com>"]
version = "0.1.1" version = "0.1.0"
edition = "2021" edition = "2021"
categories = ["encoding", "compression", "graphics", "multimedia::images", "multimedia::encoding"] categories = ["encoding", "compression", "graphics", "multimedia::images", "multimedia::encoding"]

View file

@ -1,10 +1,8 @@
<p align="center"> <p align="center">
<img title="SQP" alt="SQP Logo" width="500px" src="https://github.com/user-attachments/assets/cf2fd7f4-f825-4bb4-9427-1b7181be4639"> <img width="400px" src="https://github.com/user-attachments/assets/98f94c1c-ed6f-49a3-b906-c328035d981e">
</p> </p>
[![Lib.rs Version](https://img.shields.io/crates/v/sqp?style=for-the-badge&logo=rust&label=lib.rs&color=%23a68bfc)](https://lib.rs/crates/sqp) # SQP
[![docs.rs](https://img.shields.io/docsrs/cross_usb?style=for-the-badge)](https://docs.rs/sqp/)
**SQP** (**SQ**uishy **P**icture Format) is an image format designed **SQP** (**SQ**uishy **P**icture Format) is an image format designed
for ease of implementation and learning about compression and image formats for ease of implementation and learning about compression and image formats
while attaining a relatively good compression ratio. The general idea is to while attaining a relatively good compression ratio. The general idea is to
@ -21,7 +19,6 @@ speeds.
- Support for various color formats (RGBA, Grayscale, etc.) - Support for various color formats (RGBA, Grayscale, etc.)
- Decent compression ratios, the lossless compression can often beat PNG - Decent compression ratios, the lossless compression can often beat PNG
especially on images with transparency especially on images with transparency
- Lossy alpha compression!
- Relatively simple - Relatively simple
- Squishy! 🍡 - Squishy! 🍡
@ -33,14 +30,3 @@ speeds.
- Decoder-based frame interpolation - Decoder-based frame interpolation
- Floating point color - Floating point color
- Metadata? - Metadata?
## Examples
All examples are at 30% quality in both JPEG and SQP.
| Original | JPEG | SQP |
|----------|--------------|-------------|
| <img width="300px" src="https://github.com/user-attachments/assets/e4f7b620-4cf5-407d-851b-800c52c8a14d"> | <img width="300px" src="https://github.com/user-attachments/assets/84691e8c-2f73-4a1d-b979-0863066b159f"> | <img width="300px" src="https://github.com/user-attachments/assets/ccaa8770-b641-437f-80d1-3658f94c2e21"> |
| <img width="300px" src="https://github.com/user-attachments/assets/f0056e3b-8988-4d0d-88bf-bc73ac5b8be0"> | <img width="300px" src="https://github.com/user-attachments/assets/400c4072-ba69-45d7-8051-46a4e2867c7f"> | <img width="300px" src="https://github.com/user-attachments/assets/c4c84f64-7564-433a-a922-17da472578d9"> |
Images obtained from the following source:
[https://r0k.us/graphics/kodak/](https://r0k.us/graphics/kodak/)

View file

@ -100,9 +100,6 @@ pub fn idct(input: &[f32], width: usize, height: usize) -> Vec<u8> {
/// ///
/// Instead of using this, use the [`quantization_matrix`] function to /// Instead of using this, use the [`quantization_matrix`] function to
/// get a quantization matrix corresponding to the image quality value. /// get a quantization matrix corresponding to the image quality value.
///
/// TODO: In the future, it would be cool to figure out how to generate a
/// quantization matrix of any size.
const BASE_QUANTIZATION_MATRIX: [u16; 64] = [ const BASE_QUANTIZATION_MATRIX: [u16; 64] = [
16, 11, 10, 16, 24, 40, 51, 61, 16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55, 12, 12, 14, 19, 26, 58, 60, 55,

View file

@ -18,10 +18,8 @@
//! let width = 2; //! let width = 2;
//! let height = 2; //! let height = 2;
//! let bitmap = vec![ //! let bitmap = vec![
//! 0xFF, 0xFF, 0xFF, 0xFF, //! 255, 255, 255, 255, 0, 255, 0, 128,
//! 0x00, 0x80, 0x00, 0x80, //! 255, 255, 255, 255, 0, 255, 0, 128
//! 0xFF, 0xFF, 0xFF, 0xFF,
//! 0x00, 0x80, 0x00, 0x80,
//! ]; //! ];
//! //!
//! // Create a 2×2 image in memory. Nothing is compressed or encoded //! // Create a 2×2 image in memory. Nothing is compressed or encoded

View file

@ -58,9 +58,9 @@ pub fn add_rows(width: u32, height: u32, color_format: ColorFormat, data: &[u8])
// Interleave the offset alpha into the RGB bytes // Interleave the offset alpha into the RGB bytes
data[rgb_index..rgb_index + width as usize * (color_format.pbc() - 1)] data[rgb_index..rgb_index + width as usize * (color_format.pbc() - 1)]
.chunks(color_format.pbc() - 1) .chunks(color_format.pbc() - 1)
.zip(data[alpha_index..alpha_index + width as usize].iter()) .zip(data[alpha_index..alpha_index + width as usize].into_iter())
.flat_map(|(a, b)| { .flat_map(|(a, b)| {
a.iter().chain(vec![b]) a.into_iter().chain(vec![b])
}) })
.copied() .copied()
.collect() .collect()

View file

@ -264,5 +264,5 @@ fn decode_varint_stream(stream: &[u8]) -> Vec<i16> {
pub fn open<P: AsRef<Path>>(path: P) -> Result<SquishyPicture, Error> { pub fn open<P: AsRef<Path>>(path: P) -> Result<SquishyPicture, Error> {
let input = File::open(path)?; let input = File::open(path)?;
SquishyPicture::decode(input) Ok(SquishyPicture::decode(input)?)
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Binary file not shown.