Releases: Cykooz/fast_image_resize
Releases · Cykooz/fast_image_resize
[5.1.1] - 2025-01-13
[5.1.0] - 2024-12-09
Changed
- Improved speed (about 9%) of
SSE4.1
implementation for vertical
convolution pass for pixel types based onu8
components.
Fixed
is_aarch64_feature_detected()
is used now in
theCpuExtensions::is_supported()
method foraarch64
architecture.
[5.0.0] - 2024-10-03
Added
-
Added support for multi-thread image processing with the help of
rayon
crate.
You should enablerayon
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
andSized
to theImageView
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 toOpenCV
(exceptINTER_AREA
interpolation).
[4.1.0] - 2024-07-14
- Added support for optimization with help of
SSE4.1
andAVX2
for theF32
pixel type. - Added support for new pixel types
F32x2
,F32x3
andF32x4
with optimizations forSSE4.1
andAVX2
(#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
andImageViewMut
have been removed. They always
did unnecessary memory allocation to store references to image rows.
Instead of these structures, theImageView
andImageViewMut
traits
have been added. The crate accepts any image container that provides
these traits. - Also, traits
IntoImageView
andIntoImageViewMut
have been added.
They allow you to write runtime adapters to convert your particular
image container into something that providesImageView
/ImageViewMut
trait. Resizer
now has two methods for resize (dynamic and typed):resize()
accepts references toimpl IntoImageView
andimpl IntoImageViewMut
;resize_typed()
accepts references toimpl ImageView
andimpl 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 withU8x2
,U8x4
,U16x2
andU16x4
pixels.
- Argument
resize_alg
was removed fromResizer::new()
method, use
options
argument of methods to resize instead. - The
MulDiv
implementation has been changed in the same way asResizer
.
It now has two versions of each method: dynamic and typed. - Type of image dimensions has been changed from
NonZeroU32
intou32
.
Now you can create and use zero-sized images. Image
(embedded implementation of image container) moved from root of
the crate into moduleimages
.- Added optional feature "image".
It adds implementation of traitsIntoImageView
andIntoImageViewMut
for the
DynamicImage
type from theimage
crate. This implementation allows you to useDynamicImage
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 theCargo.toml
.
[3.0.2] - 2024-02-07
Added
- Added
Custom
variant forFilterType
enum and correspondingFilter
structure. - BREAKING: Added a new variant of enum
CropBoxError::WidthOrHeightLessOrEqualToZero
.
Changed
- Slightly improved (about 3%) speed of
AVX2
implementation ofConvolution
trait
forU8x3
andU8x4
images. - BREAKING: Changed internal data type for
U8x4
structure.
Now it is[u8; 4]
instead ofu32
. - Significantly improved (4.5 times on
x86_64
) speed of vertical convolution pass implemented
in native Rust forU8
,U8x2
,U8x3
andU8x4
images. - Changed order of convolution passes for
U8
,U8x2
,U8x3
andU8x4
images.
Now a vertical pass is the first and a horizontal pass is the second. - BREAKING: Type of the
CropBox
fields has been changed tof64
. Now you can use
fractional size and position of crop box. - BREAKING: Type of the
centering
argument ofImageView::set_crop_box_to_fit_dst_size()
andDynamicImageView::set_crop_box_to_fit_dst_size()
methods has been changed toOptional<(f64, f64)>
. - BREAKING: The
crop_box
argument ofImageViewMut::crop()
andDynamicImageViewMut::crop()
methods has been replaced with separateleft
,top
,width
andheight
arguments.