Image Compression Algorithm

Overview

Project Screen

Actions Status Lines of Code Release Latest License Downloads

Image Compression Algorithm 🦭

A new lossless image compression algorithm.

In the newest version the algorithm performs rather good, but manages to surpass PNG only in about 25%.

Here are the file sizes of the original images (optipng) and the sizes of the compressed image (with the algorithm). The size on larger volumes may be different.

File name File size (optimized PNG) in Byte File size (image-compressor) in Byte
img_1 12,537,083 12,847,145
img_2 10,791,729 10,062,265
img_3 00,001,574 00,001,781
img_4 14,076,373 18,827,534

Using the Algorithm

Using the binaries

Binaries are provided. They can be found at the releases or at the buttons at the beginning of this readme.

Compiling from source

The algorithm can be compiled from source on Windows / Mac OS / Linux without any external dependencies outside Rust.

  1. Clone this repository:

    git clone https://github.com/umgefahren/image-comp-lib-rust/

  2. Compile the source code

    a) Make sure you have rustup installed. If not install it: rustup

    b) Compile:

    cargo build --release

    The resulting binary can be found at ./target/release/image-compressor

    Compiling with the --release flag is not required but highly recommended. Otherwise the compression will take ages.

How to use the shipped binariers

One should execute the binary with the arguments provided.

  1. The first argument specifies the behavior. Pass comp for compression. Pass dec for decompression.
  2. The second argument is the input files Path.
  3. The third argument is the output files Path.

If -h or --help is passed it will give you the same instructions.

The algorithm only supports 8-Bit RGB at the moment. It should be able to compress every common image format (f.e. PNG, JPEG). But it makes no sense to compress a lossy image like a JPEG.

How the system works

Clustering

The first step in the system is clustering the pixels. This happens in 5 Dimensions, with R, G, B, x and y of every Pixel. X & Y are normed over 255 in order to have a balance between the color values and the pixel position. This might offer a possible improvement.

In the current settings a Kmeans is used to define 3 dominant clusters. More clusters are possible, but the calculation time increases rapidly with an increasing number of clusters. The encoding supports up to 255 clusters, but this is probably overkill.

After defining the clusters, we calculate a cluster map, that removes the color values and just displays belonging to a cluster. A visualization of this would look like this:

alt text

Grid

In the next step we lay a grid on top of the cluster map. The chunks of the grids are not fixed size. They vary in size near the edges. For every grid, we check if all pixels in a grid belong to the same cluster. If this is given, the pixel is calculated relative, otherwise absolute. The grid contains for every chunk a value that determines the cluster or that the chunk has to be calculated absolute. Here is an illustration of this grid map. Every white pixel, symbolizes an absolute chunk.

alt_text

This maybe a better illustration. Every white pixel, symbolizes a grid with absolute values. The three colors are the minimum values of each cluster, from that value every pixel value is calculated.

image_out_grid_detailed

Calculating Lists

In this step, we finally calculate the pixel values that are later written into the file. Every chunk is calculated according to the grid's perception of absolute or relative value. Every chucks pixel values are added to a super list of relative or absolute pixel values. The pixel values are calculated in wiggly lines. Every cluster has a minimum pixel value. This value is according to the minimum R, G, B value in that chunk. The resulting pixel value is an addition of this chunk value and the encoded pixel value.

Flatten and Byte conversion

The grid, the cluster colors, the lines are converted in Vectors of u8 and then converted into bytes.

Deflate Zstd

Grid and lines bytes representations are compressed with the deflate Zstd algorithm. This should achieve the compression and provides an opportunity to optimization.

Write File

The resulting binary is just a list of the relevant compressed objects.

Advantages compared to PNG

Because of the grid, it's possible to load just specific chunks without loading the entire image, but this is not implemented yet. With further improvements it might be possible to surpass PNG in compression rate, but I can't prove that.

Disadvantages compared to PNG

Because of the clusterisation it takes quite long to calculate a result. It might be possible to improve that, although this would probably require to abolish Kmeans for another clustering algorithm. One solution to that could be a neuronal net.

DISCLAIMER

As you can see, I'm not a computer scientist and not a very skilled programmer. I'm just a student taking careful steps in the world of computer science.

Detailed test results

Using this Dataset i achieved the following results: The hole folder with all the compressed images is 305,598,693 Bytes in size. It took 405.28 Seconds to compress them. It took 9.86 Seconds to decompress them. My compression ratio is 1.54 on the hole image set.

Image Compression Ratio (image compression algorithm) Compression Ration (PNG)
spider_web.ppm 2.14235671557331 3.8174019821404537
deer.ppm 1.2424318516015507 1.5100885950658829
fireworks.ppm 3.642381743674327 3.9167099444804947
artificial.ppm 12.25476523000428 11.676586675575187
bridge.ppm 1.2273064711294759 1.6912692993281646
flower_foveon.ppm 2.4469685311217293 3.2993969937563423
big_tree.ppm 1.2789847127858722 1.7289463913381014
cathedral.ppm 1.5089509013690656 1.94848639952808
hdr.ppm 1.9960575653205344 2.8791696311003774
leaves_iso_1600.ppm 1.203903570936856 1.5931277540194704
big_building.ppm 1.3922857035699863 1.9135150561088072
nightshot_iso_1600.ppm 1.501047996887146 1.7743906785849834
nightshot_iso_100.ppm 2.251600481220427 3.0845039578711773
leaves_iso_200.ppm 1.3158267828823695 1.7839604041821022

Weissman Scores

Weissman Scores. Calculated with an Alpha of 1.0. Gzip Baseline.

File Weissman Score
spider_web.ppm 0.19965705689076957
deer.ppm 0.17417168014135764
fireworks.ppm 0.8091634841381454
artificial.ppm -0.2316060244844763
bridge.ppm 0.22776803956557698
flower_foveon.ppm -0.4676227502970183
big_tree.ppm 0.38163765223899987
cathedral.ppm 0.3565143033247531
hdr.ppm 0.017833048215231392
leaves_iso_1600.ppm 0.04042012185180071
big_building.ppm 0.3720446250581359
nightshot_iso_1600.ppm 0.14211182900071634
nightshot_iso_100.ppm 0.14370884701981224
leaves_iso_200.ppm -0.055738991257489635
Comments
  • small rewordings and typos

    small rewordings and typos

    An example pull request, in case you want to give the whole merging process a try. This will come up a lot if you are working with multiple contributors.

    documentation 
    opened by hohMiyazawa 7
  • Performance evaluation

    Performance evaluation

    In the hope it is useful, here is my experience testing out your project.

    Getting the program running

    Your repository has no build instructions, but it nevertheless seems to work straight out of the box with cargo build --release. The build.sh script appears to have "apple-darwin" hardcoded. Otherwise no issues compiling the code.

    Compression

    Using ./image-compressor comp infile.png outfile.bin on my standard mixed-content test corpus, I obtained the following result:

    • Compression matches zstd very closely.
    • image-comp beats PNG for about 25% of the images, and gets beaten at around 75% of the images in my corpus.
    • In no cases were the image-comp files more than twice the size of PNG.
    • Memory and CPU usage were not unreasonably high.
    • The compression/decompression roundtrip was lossless for all images tested.

    img2

    Regarding the included test images img 1_4, they appear to not be particularly dense PNGs. With a modern PNG encoder, they can be (losslessly) reduced in size by about 15-20%. As an example, the PNG format is capable of compressing img_2 from the lead of the readme down to 9.9MB. That should be a more fair baseline if beating PNG is your ultimate goal.

    Good luck!

    opened by hohMiyazawa 3
  • Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.12.0+zstd.1.4.8

    Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.12.0+zstd.1.4.8

    Updates the requirements on zstd to permit the latest version.

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update image requirement from 0.23.12 to 0.24.4

    Update image requirement from 0.23.12 to 0.24.4

    Updates the requirements on image to permit the latest version.

    Changelog

    Sourced from image's changelog.

    Version 0.24.4

    New Features:

    • Encoding for webp is now available with the native library. This needs to be activate explicitly with the web-encoder feature.
    • exr decoding has gained basic limit support.

    Bug fixes:

    • The Iterator::size_hint implementation of pixel iterators has been fixed to return the current length indicated by its ExactSizeIterator hint.
    • Typos and bad references in the documentation have been removed.

    Performance:

    • ImageBuffer::get_pixel{,_mut} is now marked inline.
    • resize now short-circuits when image dimensions are unchanged.

    Version 0.24.3

    New Features:

    • TiffDecoder now supports setting resource limits.

    Bug fixes:

    • Fix compile issues on little endian systems.
    • Various panics discovered by fuzzing.

    Version 0.24.2

    Structural changes:

    • CI now runs cargo-deny, checking dependent crates to an OSS license list and against RUSTSEC advisories.

    New Features:

    • The WebP decoder recognizes and decodes images with VP8X header.
    • The DDS decoder recognizes and decodes images with DX10 headers.

    Bug fixes:

    • Calling DynamicImage/ImageBuffer's methods write_to and save will now work properly even if the backing container is larger than the image layout requires. Only the relevant slice of pixel data is passed to the encoder.
    • Fixed a OOM-panic caused by malformed images in the gif decoder.

    Version 0.24.1

    Bug Fixes:

    • ImageBuffer::get_pixel_checked would sometimes return the incorrect pixel.
    • PNG encoding would sometimes not recognize unsupported color.

    Version 0.24.0

    Breaking changes

    ... (truncated)

    Commits
    • d298607 Changes and release notes for 0.24.4
    • 162a343 Merge pull request #1792 from kianmeng/fix-typos
    • 1375fed Fix typos
    • 8624b71 Merge pull request #1784 from cycraig/master
    • 74e22f5 Merge pull request #1790 from GabrielDertoni/size_hint
    • baa5af2 fix: implement size_hint for ImageBuffer iterators
    • 794d98f Annotate C libraries in README.md
    • 7b2e1bc Fix potential overflow in WebPEncoder::encode
    • e9ccfcf Add webp-encoder
    • b354376 Merge pull request #1787 from gents83/master
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update image requirement from 0.23.12 to 0.24.3

    Update image requirement from 0.23.12 to 0.24.3

    Updates the requirements on image to permit the latest version.

    Changelog

    Sourced from image's changelog.

    Version 0.24.3

    New Features:

    • TiffDecoder now supports setting resource limits.

    Bug fixes:

    • Fix compile issues on little endian systems.
    • Various panics discovered by fuzzing.

    Version 0.24.2

    Structural changes:

    • CI now runs cargo-deny, checking dependent crates to an OSS license list and against RUSTSEC advisories.

    New Features:

    • The WebP decoder recognizes and decodes images with VP8X header.
    • The DDS decoder recognizes and decodes images with DX10 headers.

    Bug fixes:

    • Calling DynamicImage/ImageBuffer's methods write_to and save will now work properly even if the backing container is larger than the image layout requires. Only the relevant slice of pixel data is passed to the encoder.
    • Fixed a OOM-panic caused by malformed images in the gif decoder.

    Version 0.24.1

    Bug Fixes:

    • ImageBuffer::get_pixel_checked would sometimes return the incorrect pixel.
    • PNG encoding would sometimes not recognize unsupported color.

    Version 0.24.0

    Breaking changes

    Structural changes:

    • Minimum Rust version is now 1.56 and may change in minor versions until further notice. It is now tracked in the library's Cargo.toml, instead, by the standard [package.rust-version] field. Note: this applies to the library itself. You may need different version resolutions for dependencies when using a non-stable version of Rust.
    • The math::utils::{nq, utils} modules have been removed. These are better served through the color_quant crate and the standard library respectively.
    • All codecs are now available through image::codecs, no longer top-level.
    • ExtendedColorType and DynamicImage have been made #[non_exhaustive], providing more methods instead of exhaustive matching.
    • Reading images through the generic io::Reader, as well as generic convenience interfaces, now requires the underlying reader to be BufRead + Seek. This allows more efficient support more formats. Similarly, writing now requires writers to be Write + Seek.

    ... (truncated)

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.11.2+zstd.1.4.8

    Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.11.2+zstd.1.4.8

    Updates the requirements on zstd to permit the latest version.

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update image requirement from 0.23.12 to 0.24.2

    Update image requirement from 0.23.12 to 0.24.2

    Updates the requirements on image to permit the latest version.

    Changelog

    Sourced from image's changelog.

    Version 0.24.2

    Structural changes:

    • CI now runs cargo-deny, checking dependent crates to an OSS license list and against RUSTSEC advisories.

    New Features:

    • The WebP decoder recognizes and decodes images with VP8X header.
    • The DDS decoder recognizes and decodes images with DX10 headers.

    Bug fixes:

    • Calling DynamicImage/ImageBuffer's methods write_to and save will now work properly even if the backing container is larger than the image layout requires. Only the relevant slice of pixel data is passed to the encoder.
    • Fixed a OOM-panic caused by malformed images in the gif decoder.

    Version 0.24.1

    Bug Fixes:

    • ImageBuffer::get_pixel_checked would sometimes return the incorrect pixel.
    • PNG encoding would sometimes not recognize unsupported color.

    Version 0.24.0

    Breaking changes

    Structural changes:

    • Minimum Rust version is now 1.56 and may change in minor versions until further notice. It is now tracked in the library's Cargo.toml, instead, by the standard [package.rust-version] field. Note: this applies to the library itself. You may need different version resolutions for dependencies when using a non-stable version of Rust.
    • The math::utils::{nq, utils} modules have been removed. These are better served through the color_quant crate and the standard library respectively.
    • All codecs are now available through image::codecs, no longer top-level.
    • ExtendedColorType and DynamicImage have been made #[non_exhaustive], providing more methods instead of exhaustive matching.
    • Reading images through the generic io::Reader, as well as generic convenience interfaces, now requires the underlying reader to be BufRead + Seek. This allows more efficient support more formats. Similarly, writing now requires writers to be Write + Seek.
    • The Bgra* variants of buffers, which were only half-supported, have been removed. The owning buffer types ImageBuffer and DynamicImage fundamentally already make a choice in supported pixel representations. This allows for more consistent internal behavior. Callers are expected to convert formats when using those buffers, which they are required to do in any case already, and which is routinely performed by decoders.

    Trait reworks:

    • The Pixel trait is no longer implemented quite as liberally for structs

    ... (truncated)

    Commits
    • e42b402 Change notes and metadata for 0.24.2
    • f2855f1 Merge pull request #1696 from 5225225/fix-gif-oom
    • 95b53b9 Use free_usize instead of a u64::try_from in gif.rs
    • b41b4bb Fix OOM when decoding gif with very large buffer
    • ae1e661 Merge pull request #1703 from johannesvollmer/update-exrs-license
    • 035778d update openexr (exr crate license was updated)
    • 2f6d97a Merge pull request #1702 from gents83/master
    • a7f080b Fixing clippy warnings
    • 5fe5764 Merge pull request #1700 from linkmauve/direct-rgba
    • 3862f76 avif-decoder: Convert directly to RGBA
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.11.1+zstd.1.4.8

    Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.11.1+zstd.1.4.8

    Updates the requirements on zstd to permit the latest version.

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.11.0+zstd.1.4.8

    Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.11.0+zstd.1.4.8

    Updates the requirements on zstd to permit the latest version.

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update image requirement from 0.23.12 to 0.24.1

    Update image requirement from 0.23.12 to 0.24.1

    Updates the requirements on image to permit the latest version.

    Changelog

    Sourced from image's changelog.

    Version 0.24.1

    Bug Fixes:

    • ImageBuffer::get_pixel_checked would sometimes return the incorrect pixel.
    • PNG encoding would sometimes not recognize unsupported color.

    Version 0.24.0

    Breaking changes

    Structural changes:

    • Minimum Rust version is now 1.56 and may change in minor versions until further notice. It is now tracked in the library's Cargo.toml, instead, by the standard [package.rust-version] field. Note: this applies to the library itself. You may need different version resolutions for dependencies when using a non-stable version of Rust.
    • The math::utils::{nq, utils} modules have been removed. These are better served through the color_quant crate and the standard library respectively.
    • All codecs are now available through image::codecs, no longer top-level.
    • ExtendedColorType and DynamicImage have been made #[non_exhaustive], providing more methods instead of exhaustive matching.
    • Reading images through the generic io::Reader, as well as generic convenience interfaces, now requires the underlying reader to be BufRead + Seek. This allows more efficient support more formats. Similarly, writing now requires writers to be Write + Seek.
    • The Bgra* variants of buffers, which were only half-supported, have been removed. The owning buffer types ImageBuffer and DynamicImage fundamentally already make a choice in supported pixel representations. This allows for more consistent internal behavior. Callers are expected to convert formats when using those buffers, which they are required to do in any case already, and which is routinely performed by decoders.

    Trait reworks:

    • The Pixel trait is no longer implemented quite as liberally for structs defined in the crate. Instead, it is now restricted to a set of known channel which ensures accuracy in computations involving those channels.
    • The ImageDecoderExt trait has been renamed to ImageDecoderRect, according to its actual functionality.
    • The Pixel trait and its Subpixel field no longer require (or provide) a 'static lifetime bound.
    • The Pixel trait no longer requires specifying an associated, constant ColorType. This was of little relevance to computation but made it much harder to implement and extend correctly. Instead, the private PixelWithColorType extension is added for interfaces that require a properly known variant.
    • Reworked how SubImage interacts with the GenericImage trait. It is now a default implementation. Note that SubImage now has inherent methods that avoid double-indirection, the trait's method will no longer avoid this.
    • The Primitive trait now requires implementations to provide a minimum and maximum logical bound for the purpose of converting to other primitive

    ... (truncated)

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update image requirement from 0.23.12 to 0.24.0

    Update image requirement from 0.23.12 to 0.24.0

    Updates the requirements on image to permit the latest version.

    Changelog

    Sourced from image's changelog.

    Version 0.24.0

    Breaking changes

    Structural changes:

    • Minimum Rust version is now 1.56 and may change in minor versions until further notice. It is now tracked in the library's Cargo.toml, instead, by the standard [package.rust-version] field. Note: this applies to the library itself. You may need different version resolutions for dependencies when using a non-stable version of Rust.
    • The math::utils::{nq, utils} modules have been removed. These are better served through the color_quant crate and the standard library respectively.
    • All codecs are now available through image::codecs, no longer top-level.
    • ExtendedColorType and DynamicImage have been made #[non_exhaustive], providing more methods instead of exhaustive matching.
    • Reading images through the generic io::Reader, as well as generic convenience interfaces, now requires the underlying reader to be BufRead + Seek. This allows more efficient support more formats. Similarly, writing now requires writers to be Write + Seek.
    • The Bgra* variants of buffers, which were only half-supported, have been removed. The owning buffer types ImageBuffer and DynamicImage fundamentally already make a choice in supported pixel representations. This allows for more consistent internal behavior. Callers are expected to convert formats when using those buffers, which they are required to do in any case already, and which is routinely performed by decoders.

    Trait reworks:

    • The Pixel trait is no longer implemented quite as liberally for structs defined in the crate. Instead, it is now restricted to a set of known channel which ensures accuracy in computations involving those channels.
    • The ImageDecoderExt trait has been renamed to ImageDecoderRect, according to its actual functionality.
    • The Pixel trait and its Subpixel field no longer require (or provide) a 'static lifetime bound.
    • The Pixel trait no longer requires specifying an associated, constant ColorType. This was of little relevance to computation but made it much harder to implement and extend correctly. Instead, the private PixelWithColorType extension is added for interfaces that require a properly known variant.
    • Reworked how SubImage interacts with the GenericImage trait. It is now a default implementation. Note that SubImage now has inherent methods that avoid double-indirection, the trait's method will no longer avoid this.
    • The Primitive trait now requires implementations to provide a minimum and maximum logical bound for the purpose of converting to other primitive representations.

    Additions

    Image formats:

    • Reading lossless WebP is now supported.

    ... (truncated)

    Commits
    • 63489d5 Move planned initialization changes to Unrelease section
    • 899fe92 Bump version number to 0.24
    • dda8c62 Fix unfinished note on AvifEncoder
    • 2c457a5 Fix release note typos caught in review
    • 0da83d6 Draft of Changelog for v0.24
    • 5231652 Merge pull request #1661 from HeroicKatora/upgrade-and-fixes-for-0.24
    • 30e42a1 Comment exception in utils quickcheck
    • dee5590 Succeed early on unusual resize quickcheck case
    • 9a1e601 Update public-private dependency spec
    • 35feee4 Upgrade dependencies
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.12.1+zstd.1.4.8

    Update zstd requirement from 0.9.2+zstd.1.4.8 to 0.12.1+zstd.1.4.8

    Updates the requirements on zstd to permit the latest version.

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Update image requirement from 0.23.12 to 0.24.5

    Update image requirement from 0.23.12 to 0.24.5

    Updates the requirements on image to permit the latest version.

    Changelog

    Sourced from image's changelog.

    Version 0.24.5

    Structural changes:

    • Increased the minimum supported Rust version (MSRV) to 1.61.
    • Increased the version requirement for the tiff crate to 0.8.0.
    • Increased the version requirement for the jpeg crate to 0.3.0.

    Bug fixes:

    • The as_rgb32f function of DynamicImage is now correctly documented.
    • Fixed a crash when decoding ICO images. Added a regression test.
    • Fixed a panic when transforming webp images. Added a regression test.
    • Added a check to prevent integer overflow when calculating file size for BMP images. The missing check could panic in debug mode or else set an incorrect file size in release mode.
    • Upgraded the PNG image encoder to use the newer PngEncoder::write_image instead of the deprecated PngEncoder::encode which did not account for byte order and could result in images with incorrect colors.
    • Fixed InsufficientMemory error when trying to decode a PNG image.
    • Fix warnings and CI issues.
    • Typos and links in the documentation have been corrected.

    Performance:

    • Added check for dynamic image dimensions before resizing. This improves performance in cases where the image does not need to be resized or has already been resized.

    Version 0.24.4

    New Features:

    • Encoding for webp is now available with the native library. This needs to be activate explicitly with the web-encoder feature.
    • exr decoding has gained basic limit support.

    Bug fixes:

    • The Iterator::size_hint implementation of pixel iterators has been fixed to return the current length indicated by its ExactSizeIterator hint.
    • Typos and bad references in the documentation have been removed.

    Performance:

    • ImageBuffer::get_pixel{,_mut} is now marked inline.
    • resize now short-circuits when image dimensions are unchanged.

    Version 0.24.3

    New Features:

    • TiffDecoder now supports setting resource limits.

    Bug fixes:

    • Fix compile issues on little endian systems.
    • Various panics discovered by fuzzing.

    ... (truncated)

    Commits
    • aa1e81e Changes and release notes for 0.24.5
    • 88aadcb Merge pull request #1821 from micahsnyder/bump-jpeg-dependency
    • dffefce Bump the 'jpeg' version requirement to 0.3.0
    • bf0a96b Merge pull request #1812 from fintelia/png-with-limits
    • a7026e9 Merge pull request #1817 from Flashover89/Check-dimensions-for-dyn-image-befo...
    • 392798c Fix white spacing
    • 2be3d17 Merge branch 'image-rs:master' into Check-dimensions-for-dyn-image-before-res...
    • 4681225 Fix review findings
    • 1361f4a Add PngDecoder::with_limits
    • 1878c88 Merge pull request #1815 from fintelia/fix-ci
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Update criterion requirement from 0.3 to 0.4

    Update criterion requirement from 0.3 to 0.4

    Updates the requirements on criterion to permit the latest version.

    Changelog

    Sourced from criterion's changelog.

    [0.4.0] - 2022-09-10

    Removed

    • The Criterion::can_plot function has been removed.
    • The Criterion::bench_function_over_inputs function has been removed.
    • The Criterion::bench_functions function has been removed.
    • The Criterion::bench function has been removed.

    Changed

    • HTML report hidden behind non-default feature flag: 'html_reports'
    • Standalone support (ie without cargo-criterion) feature flag: 'cargo_bench_support'
    • MSRV bumped to 1.57
    • rayon and plotters are optional (and default) dependencies.
    • Status messages ('warming up', 'analyzing', etc) are printed to stderr, benchmark results are printed to stdout.
    • Accept subsecond durations for --warm-up-time, --measurement-time and --profile-time.
    • Replaced serde_cbor with ciborium because the former is no longer maintained.
    • Upgrade clap to v3 and regex to v1.5.

    Added

    • A --discard-baseline flag for discarding rather than saving benchmark results.
    • Formal support for benchmarking code compiled to web-assembly.
    • A --quiet flag for printing just a single line per benchmark.
    • A Throughput::BytesDecimal option for measuring throughput in bytes but printing them using decimal units like kilobytes instead of binary units like kibibytes.

    Fixed

    • When using bench_with_input, the input parameter will now be passed through black_box before passing it to the benchmark.

    [0.3.6] - 2022-07-06

    Changed

    • MSRV bumped to 1.49
    • Symbol for microseconds changed from ASCII 'us' to unicode 'µs'
    • Documentation fixes
    • Clippy fixes

    [0.3.5] - 2021-07-26

    Fixed

    • Corrected Criterion.toml in the book.
    • Corrected configuration typo in the book.

    Changed

    • Bump plotters dependency to always include a bug-fix.
    • MSRV bumped to 1.46.

    ... (truncated)

    Commits
    • 5e27b69 Merge branch 'version-0.4'
    • 4d6d69a Increment version numbers.
    • 935c632 Add Throughput::BytesDecimal. Fixes #581.
    • f82ce59 Remove critcmp code (it belongs in cargo-criterion) (#610)
    • a18d080 Merge branch 'master' into version-0.4
    • f9c6b8d Merge pull request #608 from Cryptex-github/patch-1
    • 8d0224e Fix html report path
    • 2934163 Add missing black_box for bench_with_input parameters. Fixes 566.
    • dfd7b65 Add duplicated benchmark ID to assertion message.
    • ce8259e Bump criterion-plot version number.
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Update ndarray requirement from 0.14.0 to 0.15.6

    Update ndarray requirement from 0.14.0 to 0.15.6

    Updates the requirements on ndarray to permit the latest version.

    Changelog

    Sourced from ndarray's changelog.

    Version 0.15.6 (2022-07-30)

    New features

    Other changes

    Version 0.15.5 (2022-07-30)

    Enhancements

    Other changes

    Version 0.15.4 (2021-11-23)

    ... (truncated)

    Commits
    • e080d62 Release version 0.15.6
    • 853384a Merge pull request #1151 from adamreichold/pub-get-ptr
    • eb50663 Rename get_ptr_mut to get_mut_ptr to be more consistent with the as_mut_ptr m...
    • 2f0b37b Make ArrayBase::get_ptr(_mut) public to enable indexing into raw views.
    • dedb15f Merge pull request #1190 from jturner314/cherry-pick-1171
    • 1d0212c fix(clippy): remove unnecessary keyword in format
    • a6c8bd2 fix(clippy): remove unnecessary derefs
    • 45a1ded fix(doctest): allow warning of unused #[macro_use] in itertools doctest
    • cd6fc28 fix(clippy): remove unused lifetimes from trait impls
    • ff74996 fix(ci): lint with clippy
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Update nshare requirement from 0.2.0 to 0.9.0

    Update nshare requirement from 0.2.0 to 0.9.0

    Updates the requirements on nshare to permit the latest version.

    Commits
    • cd4a5c0 make crate no_std supporting for nalgebra -> ndarray use case
    • 06e337e tonalgebra/ndarray_impl only works with alloc
    • 36ccc18 move features into ensure_no_std rather than CI script
    • e98e170 correct actions-rs/cargo args to use string
    • c7e03ec do not include nalgebra_std or image features when testig no_std
    • 1e525ff actually update the CI file (never saved)
    • c46d13e change the CI badge to work with new tests
    • df3b48b add new CI test pattern
    • a584961 bump version to v0.9.0
    • 6d5ea0f (cargo-release) version 0.8.0
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • [ImgBot] Optimize images

    [ImgBot] Optimize images

    Beep boop. Your images are optimized!

    Your image file size has been reduced by 14% 🎉

    Details

    | File | Before | After | Percent reduction | |:--|:--|:--|:--| | /images/dif_image.png | 43.45kb | 17.25kb | 60.29% | | /images/out_cluster_map.png | 117.21kb | 51.60kb | 55.98% | | /images/decompressed.png | 16,521.26kb | 13,702.86kb | 17.06% | | /images/decoded_comp_list.png | 12,384.95kb | 10,567.44kb | 14.68% | | /images/out_points.png | 12,384.95kb | 10,567.44kb | 14.68% | | /images/decoded_list.png | 14,039.36kb | 12,886.53kb | 8.21% | | | | | | | Total : | 55,491.20kb | 47,793.13kb | 13.87% |


    Black Lives Matter | 💰 donate | 🎓 learn | ✍🏾 sign

    📝 docs | :octocat: repo | 🙋🏾 issues | 🏅 swag | 🏪 marketplace

    opened by imgbot[bot] 0
Releases(v0.0.1)
Owner
Hannes
I do stuff with Rust and Python
Hannes
A Rust encoder/decoder for Dominic Szablewski's QOI format for fast, lossless image compression.

QOI - The “Quite OK Image” format This is a Rust encoder and decoder for Dominic Szablewski's QOI format for fast, lossless image compression. See the

Chevy Ray Johnston 62 Nov 29, 2022
Lust is a static image server designed to automatically convert uploaded image to several formats and preset sizes

What is Lust? Lust is a static image server designed to automatically convert uploaded image to several formats and preset sizes with scaling in mind.

Harrison Burt 242 Dec 22, 2022
Takes a folder of images (as a palette), and an image, and figures out how to tile the palette to resemble the image!

Takes a folder of images (as a palette), and an image, and figures out how to tile the palette to resemble the image!

Jacob 258 Dec 30, 2022
Rust Lean Image Viewer - Fast and configurable image viewer inspired by JPEGView by David Kleiner

Rust Lean Image Viewer - Fast and configurable image viewer inspired by JPEGView by David Kleiner

3top1a 4 Apr 9, 2022
Oxipng - a multithreaded lossless PNG compression optimizer

Oxipng Overview Oxipng is a multithreaded lossless PNG compression optimizer. It can be used via a command-line interface or as a library in other Rus

Josh Holmer 1.8k Dec 28, 2022
Image processing operations

imageproc An image processing library, based on the image library. There may initially be overlap between the functions in this library and those in i

image-rs 512 Jan 8, 2023
tai (Terminal Ascii Image) tool to convert images to ascii written in Rust

TAI Terminal Ascii Image A tool to convert images to ascii art written in Rust ?? Notes This tool is still in development stage. Contributions All Con

Mustafa Salih 258 Dec 5, 2022
Artsy pixel image to vector graphics converter

inkdrop inkdrop is an artsy bitmap to vector converter. Command line interface The CLI binary is called inkdrop-cli and reads almost any image bitmap

Matthias Vogelgesang 62 Dec 26, 2022
Open Graphic Image Writer

Open Graphic Image Writer Documentation You can generate Open Graphic Image dynamically. A CSS-like API. You can generate image by using template imag

keiya sasaki 46 Dec 15, 2022
Signed distance field font and image command line tool based on OpenCL.

SDFTool Signed distance field font and image command line tool based on OpenCL. Build Windows Run cargo build --release in Visual Studio developer x64

弦语蝶梦 7 Oct 16, 2022
A simple image average color extractor written in 🦀 Rust

A simple image average color extractor written in ?? Rust

Victor Aremu 3 Sep 23, 2021
A simple command-line utility (and Rust crate!) for converting from a conventional image file (e.g. a PNG file) into a pixel-art version constructed with emoji

EmojiPix This is a simple command-line utility (and Rust crate!) for converting from a conventional image file (e.g. a PNG file) into a pixel-art vers

Michael Milton 22 Dec 6, 2022
A Simple Image to Ascii converter in Rust

Image to Ascii A Simple Image to Ascii converter in Rust Brief ?? In my way to learn Rust i decided to make this converter. Challenges ?? new to Rust

WasixXD 7 Sep 16, 2022
Rust library for fast image resizing with using of SIMD instructions.

fast_image_resize Rust library for fast image resizing with using of SIMD instructions. CHANGELOG Supported pixel formats and available optimisations:

Kirill Kuzminykh 115 Jan 5, 2023
Experimental vectorized-raster image editor

Sverg Sverg is an experimental image editor that leverages the power of modern hardware so that you can create images as if they were raster images (e

sdfgeoff 3 Jan 25, 2022
Rust port of the Quite Okay Image format

qoi_rs What is this? A pretty boring Rust translation of qoi. Status What's there Encode & Decode works Results agree with the C implementation for al

null 9 Dec 9, 2021
An advanced image processing library for Rust.

ImageProc Maintainers: @chyh1990 Note: this project is under active depvelopment, API may change! imageproc is a advanced image proccessing library fo

Chen Yuheng 97 Oct 18, 2022
Web-app that simulates different types of color blindness from a user-provided input image.

What is Dalted? Web-app that simulates different types of color blindness from a user-provided input image. Resources The color blindness simulation i

Jorge Carrasco 18 Dec 20, 2022
Get the first frame of a Gif image.

Gif First Frame Use wasm to capture the first frame of a Gif image.

lijialiang 3 Apr 8, 2022