Skip to content

Latest commit

 

History

History
511 lines (382 loc) · 17.5 KB

CHANGELOG.md

File metadata and controls

511 lines (382 loc) · 17.5 KB

[5.0.0] - 2024-10-03

Added

  • Added support for multi-thread image processing with the help of rayon crate. You should enable rayon feature to turn on this behavior.

  • Added methods to split image in different directions:

    • ImageView::split_by_height()
    • ImageView::split_by_width()
    • ImageViewMut::split_by_height_mut()
    • ImageViewMut::split_by_width_mut()

    These methods have default implementation and are used for multi-thread image processing.

Changed

  • BREAKING: Added supertraits Send, Sync and Sized to the ImageView trait.
  • Optimized convolution algorythm by deleting zero coefficients from start and end of bounds.

[4.2.1] - 2024-07-24

Fixed

  • Disabled default features of the image crate (#36).

[4.2.0] - 2024-07-19

Added

  • Added new resize algorithm ResizeAlg::Interpolation (#32).

    It is like ResizeAlg::Convolution but with fixed kernel size. This algorithm can be useful if you want to get a result similar to OpenCV (except INTER_AREA interpolation).

[4.1.0] - 2024-07-14

Added

  • Added support for optimization with help of SSE4.1 and AVX2 for the F32 pixel type.
  • Added support for new pixel types F32x2, F32x3 and F32x4 with optimizations for SSE4.1 and AVX2 (#30).

[4.0.0] - 2024-05-13

Added

  • Added Gaussian filter for convolution algorithm.
  • Method PixelType::size() was made public.
  • Added new image containers:
    • ImageRef
    • TypedImageRef
    • TypedImage
    • TypedCroppedImage
    • TypedCroppedImageMut
    • CroppedImage
    • CroppedImageMut

Fixed

  • Fixed dividing image by alpha channel.

Changed

A lot of breaking changes have been done in this release:

  • Structures ImageView and ImageViewMut have been removed. They always did unnecessary memory allocation to store references to image rows. Instead of these structures, the ImageView and ImageViewMut traits have been added. The crate accepts any image container that provides these traits.
  • Also, traits IntoImageView and IntoImageViewMut have been added. They allow you to write runtime adapters to convert your particular image container into something that provides ImageView/ImageViewMut trait.
  • Resizer now has two methods for resize (dynamic and typed):
    • resize() accepts references to impl IntoImageView and impl IntoImageViewMut;
    • resize_typed() accepts references to impl ImageView and impl ImageViewMut.
  • Resize methods also accept the options argument. With the help of this argument, you can specify:
    • resize algorithm (default: Lanczos3);
    • how to crop the source image;
    • whether to multiply the source image by the alpha channel and divide the destination image by the alpha channel. By default, Resizer multiplies and divides by alpha channel images with U8x2, U8x4, U16x2 and U16x4 pixels.
  • Argument resize_alg was removed from Resizer::new() method, use options argument of methods to resize instead.
  • The MulDiv implementation has been changed in the same way as Resizer. It now has two versions of each method: dynamic and typed.
  • Type of image dimensions has been changed from NonZeroU32 into u32. Now you can create and use zero-sized images.
  • Image (embedded implementation of image container) moved from root of the crate into module images.
  • Added optional feature "image". It adds implementation of traits IntoImageView and IntoImageViewMut for the DynamicImage type from the image crate. This implementation allows you to use DynamicImage instances as arguments for methods of this crate.

Look at the difference between versions 3 and 4 on example of resizing RGBA8 image from given u8-buffer with pixels-data.

3.x version:

use fast_image_resize::{Image, MulDiv, PixelType, Resizer};
use std::num::NonZeroU32;

fn my_resize(
    src_width: u32,
    src_height: u32,
    src_pixels: &mut [u8],
    dst_width: u32,
    dst_height: u32,
) -> Image {
    let src_width = NonZeroU32::new(src_width).unwrap();
    let src_height = NonZeroU32::new(src_height).unwrap();
    let src_image = Image::from_slice_u8(
        src_width,
        src_height,
        src_pixels,
        PixelType::U8x4,
    ).unwrap();

    // Multiple RGB channels of source image by alpha channel.
    let alpha_mul_div = MulDiv::default();
    let mut tmp_image = Image::new(
        src_width,
        src_height,
        PixelType::U8x4,
    );
    alpha_mul_div
        .multiply_alpha(
            &src_image.view(),
            &mut tmp_image.view_mut(),
        ).unwrap();

    // Create container for data of destination image.
    let dst_width = NonZeroU32::new(dst_width).unwrap();
    let dst_height = NonZeroU32::new(dst_height).unwrap();
    let mut dst_image = Image::new(
        dst_width,
        dst_height,
        PixelType::U8x4,
    );

    // Get mutable view of destination image data.
    let mut dst_view = dst_image.view_mut();

    // Create Resizer instance and resize source image
    // into buffer of destination image.
    let mut resizer = Resizer::default();
    resizer.resize(&tmp_image.view(), &mut dst_view).unwrap();

    // Divide RGB channels of destination image by alpha.
    alpha_mul_div.divide_alpha_inplace(&mut dst_view).unwrap();

    dst_image
}

4.x version:

use fast_image_resize::images::{Image, ImageRef};
use fast_image_resize::{PixelType, Resizer};

fn my_resize(
    src_width: u32,
    src_height: u32,
    src_pixels: &[u8],
    dst_width: u32,
    dst_height: u32,
) -> Image {
    let src_image = ImageRef::new(
        src_width,
        src_height,
        src_pixels,
        PixelType::U8x4,
    ).unwrap();

    // Create container for data of destination image.
    let mut dst_image = Image::new(
        dst_width,
        dst_height,
        PixelType::U8x4,
    );

    // Create Resizer instance and resize source image
    // into buffer of destination image.
    let mut resizer = Resizer::new();
    // By default, Resizer multiplies and divides by alpha channel
    // images with U8x2, U8x4, U16x2 and U16x4 pixels.
    resizer.resize(&src_image, &mut dst_image, None).unwrap();

    dst_image
}

[3.0.4] - 2024-02-15

Fixed

  • Fixed error with incorrect cropping of source image.

[3.0.3] - 2024-02-07

Fixed

  • Fixed version of num-traits in the Cargo.toml.

[3.0.2] - 2024-02-07

Added

  • Added Custom variant for FilterType enum and corresponding Filter structure.
  • BREAKING: Added a new variant of enum CropBoxError::WidthOrHeightLessOrEqualToZero.

Changed

  • Slightly improved (about 3%) speed of AVX2 implementation of Convolution trait for U8x3 and U8x4 images.
  • BREAKING: Changed internal data type for U8x4 structure. Now it is [u8; 4] instead of u32.
  • Significantly improved (4.5 times on x86_64) speed of vertical convolution pass implemented in native Rust for U8, U8x2, U8x3 and U8x4 images.
  • Changed order of convolution passes for U8, U8x2, U8x3 and U8x4 images. Now a vertical pass is the first and a horizontal pass is the second.
  • BREAKING: Type of the CropBox fields has been changed to f64. Now you can use fractional size and position of crop box.
  • BREAKING: Type of the centering argument of ImageView::set_crop_box_to_fit_dst_size() and DynamicImageView::set_crop_box_to_fit_dst_size() methods has been changed to Optional<(f64, f64)>.
  • BREAKING: The crop_box argument of ImageViewMut::crop() and DynamicImageViewMut::crop() methods has been replaced with separate left, top, width and height arguments.

[2.7.3] - 2023-05-07

Fixed

  • Fixed size of rows in cropped ImageViewMut created by ImageViewMut::crop method (#17).

[2.7.2] - 2023-05-04

Fixed

  • Added using of (read|write)_unaligned for unaligned pointers on arm64 and wasm32 architectures. (#15).

[2.7.1] - 2023-04-28

Fixed

  • Added using of (read|write)_unaligned for unaligned pointers on x86_64 architecture. (#16).

[2.7.0] - 2023-03-24

Added

  • Added method DynamicImageViewMut::crop() to create cropped version of DynamicImageViewMut (#13).
  • Added method ImageViewMut::crop() to create cropped version of ImageViewMut.

[2.6.0] - 2023-03-01

Crate

  • Slightly improved speed of Convolution implementation for U8x2 images and Wasm32 SIMD128 instructions.
  • Method Image::buffer_mut() was made public (#14)

[2.5.0] - 2023-01-29

Crate

  • Added support of optimisation with helps of Wasm32 SIMD128 for all types of images exclude I32 and F32 (thanks to @cdmurph32, #11).

Benchmarks

  • Benchmark framework glassbench replaced by criterion.
  • Added report with results of benchmarks for wasm32-wasi target.

[2.4.0] - 2022-12-11

Crate

  • Slightly improved speed of MulDiv implementation for U8x2, U8x4, U16x2 and U16x4 images.
  • Added optimisation for processing U16x2 images by MulDiv with helps of NEON SIMD instructions.
  • Excluded possibility of unnecessary operations during resize of cropped image by convolution algorithm.
  • Added implementation From trait to convert ImageViewMut into ImageView.
  • Added implementation From trait to convert DynamicImageViewMut into DynamicImageView.

[2.3.0] - 2022-11-25

Crate

  • Added support of optimisation with helps of NEON SIMD for convolution of U16 images.
  • Added support of optimisation with helps of NEON SIMD for convolution of U16x2 images.
  • Added support of optimisation with helps of NEON SIMD for convolution of U16x3 images.
  • Improved optimisation of convolution with helps of NEON SIMD for U8 images.

[2.2.0] - 2022-11-18

Crate

  • Added support of optimisation with helps of NEON SIMD for convolution of U8 images.
  • Added support of optimisation with helps of NEON SIMD for convolution of U8x2 images.
  • Added support of optimisation with helps of NEON SIMD for convolution of U8x3 images.
  • Added optimisation for processing U8x2 images by MulDiv with helps of NEON SIMD instructions.

[2.1.0] - 2022-11-11

Crate

  • Added method CpuExtensions::is_supported(&self).
  • Internals of PixelComponentMapper changed to use heap to store its data.
  • Added support of optimisation with helps of NEON SIMD for convolution of U16x4 images.
  • Added optimisation for processing U16x4 images by MulDiv with helps of NEON SIMD instructions.
  • Added full optimisation for convolution of U8 images with helps of SSE4.1 instructions.
  • Fixed link to documentation page in README.md file.
  • Fixed error in implementation of MulDiv::divide_alpha() and MulDiv::divide_alpha_inplace() for U16x4 pixels with optimisation with helps of SSE4.1 and AVX2.
  • Improved optimisation of MulDiv with helps of NEON SIMD for U8x4 pixels.

[2.0.0] - 2022-10-28

Crate

  • Breaking changes:
    • Struct ImageView replaced by enum DynamicImageView.
    • Struct ImageViewMut replaced by enum DynamicImageViewMut.
    • Trait Pixel renamed into PixelExt and some its internals changed:
      • associated type ComponentsCount renamed into CountOfComponents.
      • associated type ComponentCountOfValues deleted.
      • associated method components_count renamed into count_of_components.
      • associated method component_count_of_values renamed into count_of_component_values.
    • All pixel types (U8, U8x2, ...) replaced by type aliases for new generic structure Pixel. Use method new() to create instance of one pixel.
  • Added structure PixelComponentMapper that holds tables for mapping values of pixel's components in forward and backward directions.
  • Added function create_gamma_22_mapper() to create instance of PixelComponentMapper that converts images with gamma 2.2 to linear colorspace and back.
  • Added function create_srgb_mapper() to create instance of PixelComponentMapper that converts images from SRGB colorspace to linear RGB and back.
  • Added generic structs ImageView and ImageViewMut.
  • Added functions change_type_of_pixel_components and change_type_of_pixel_components_dyn that change type of pixel's components in whole image.
  • Added generic trait IntoPixelComponent<Out: PixelComponent>.
  • Added generic structure Pixel for create all types of pixels.
  • Added full support of optimisation with helps of SSE4.1 for convolution of U8x3 images.
  • Added support of optimisation with helps of NEON SIMD for convolution of U8x4 images.
  • Added optimisation for processing U8x4 images by MulDiv with helps of NEON SIMD instructions.

Example application

  • Added option --high_precision to use u16 as pixel components for intermediate image representation.
  • Added converting of source image into linear colorspace before it will be resized. Destination image will be returned into original colorspace before it will be saved.

[1.0.0] - 2022-07-24

  • Added example of command line application "resizer".

[0.9.7] - 2022-07-14

  • Fixed resizing when the destination image has the same dimensions as the source image (#9).

[0.9.6] - 2022-06-28

  • Added support of new type of pixels PixelType::U16x4.
  • Fixed benchmarks for resizing images with alpha channel using the resizer crate.
  • Removed image crate from benchmarks for resizing images with alpha.
  • Added method Image::copy(&self) -> Image<'static>.

[0.9.5] - 2022-06-22

  • Fixed README.md

[0.9.4] - 2022-06-22

  • Added support of new type of pixels PixelType::U16x2 (e.g. luma with alpha channel).

[0.9.3] - 2022-05-31

  • Added support of new type of pixels PixelType::U16.

[0.9.2] - 2022-05-19

  • Added optimisation for convolution of U8x2 images with helps of SSE4.1.

[0.9.1] - 2022-05-12

  • Added optimisation for processing U8x2 images by MulDiv with helps of SSE4.1 and AVX2 instructions.
  • Added optimisation for convolution of U16x2 images with helps of AVX2 instructions.

[0.9.0] - 2022-05-01

  • Added support of new type of pixels PixelType::U8x2.
  • Added into MulDiv support of images with pixel type U8x2.
  • Added method Image::into_vec(self) -> Vec<u8> (#7).

[0.8.0] - 2022-03-23

  • Added optimisation for convolution of U16x3 images with helps of SSE4.1 and AVX2 instructions.
  • Added partial optimisation for convolution of U8 images with helps of SSE4.1 instructions.
  • Allowed to create an instance of Image, ImageVew and ImageViewMut from a buffer larger than necessary (#5).
  • Breaking changes:
    • Removed methods: Image::from_vec_u32(), Image::from_slice_u32().
    • Removed error InvalidBufferSizeError.

[0.7.0] - 2022-01-27

  • Added support of new type of pixels PixelType::U16x3.
  • Breaking changes:
    • Added variant U16x3 into the enum PixelType.

[0.6.0] - 2022-01-12

  • Added optimisation of multiplying and dividing image by alpha channel with helps of SSE4.1 instructions.
  • Improved performance of dividing image by alpha channel without forced SIMD instructions.
  • Breaking changes:
    • Deleted variant SSE2 from enum CpuExtensions.

[0.5.3] - 2021-12-14

  • Added optimisation of convolution U8x3 images with helps of AVX2 instructions.
  • Fixed error in code for convolution U8x4 images with helps of SSE4.1 instructions.
  • Fixed error in code for convolution U8 images with helps of AVX2 instructions.

[0.5.2] - 2021-11-26

  • Fixed compile errors on non-x86 architectures.

[0.5.1] - 2021-11-24

  • Fixed compile errors on non-x86 architectures.

[0.5.0] - 2021-11-18

  • Added support of new type of pixels PixelType::U8x3 (with auto-vectorization for SSE4.1).
  • Exposed module fast_image_resize::pixels with types U8x3, U8x4, F32, I32, U8 used as wrappers for represent type of one pixel of image.
  • Some optimisations in code of convolution written in Rust (without intrinsics for SIMD).
  • Breaking changes:
    • Added variant U8x3 into the enum PixelType.
    • Changed internal tuple structures inside of variant of ImageRows and ImageRowsMut enums.

[0.4.1] - 2021-11-13

  • Added optimisation of convolution grayscale images (U8) with helps of AVX2 instructions.

[0.4.0] - 2021-10-23

  • Added support of new type of pixels PixelType::U8 (without forced SIMD).
  • Breaking changes:
    • ImageData renamed into Image.
    • SrcImageView and DstImageView replaced by ImageView and ImageViewMut.
    • Method Resizer.resize() now returns Result<(), DifferentTypesOfPixelsError>.

[0.3.1] - 2021-10-09

  • Added support of compilation for architectures other than x86_64.

[0.3.0] - 2021-08-28

  • Added method SrcImageView.set_crop_box_to_fit_dst_size().
  • Fixed out-of-bounds error during resize with cropping.
  • Refactored ImageData.
    • Added methods: from_vec_u32(), from_vec_u8(), from_slice_u32(), from_slice_u8().
    • Removed methods: from_buffer(), from_pixels().

[0.2.0] - 2021-08-02

  • Fixed typo in name of CatmullRom filter type.