49 lines
1.8 KiB
Rust
49 lines
1.8 KiB
Rust
|
|
extern crate image as png;
|
|
|
|
extern crate exr;
|
|
|
|
|
|
/// Read an rgba image, or fail if none can be found.
|
|
/// Then crop away transparent pixels,
|
|
/// and write the cropped result to another file.
|
|
/// This retains only the rgb pixels, and no other layers.
|
|
pub fn main() {
|
|
use exr::prelude::*;
|
|
use exr::image::pixel_vec::*; // import predefined pixel storage
|
|
|
|
let path = "tests/images/valid/custom/oh crop.exr";
|
|
|
|
type DynamicRgbaPixel = (Sample, Sample, Sample, Sample); // `Sample` is an enum containing the original data type (f16,f32, or u32)
|
|
|
|
// load an rgba image
|
|
// this specific example discards all but the first valid rgb layers and converts all pixels to f32 values
|
|
// TODO optional alpha channel!
|
|
let image: PixelImage<PixelVec<DynamicRgbaPixel>, RgbaChannels> = read_first_rgba_layer_from_file(
|
|
path,
|
|
PixelVec::<DynamicRgbaPixel>::constructor,
|
|
|
|
// use this predefined rgba pixel container from the exr crate, requesting any type of pixels with 3 or 4 values
|
|
PixelVec::set_pixel
|
|
).expect("this file exists in the exrs repository. download that?");
|
|
|
|
// construct a ~simple~ cropped image
|
|
let image: Image<Layer<CroppedChannels<SpecificChannels<PixelVec<DynamicRgbaPixel>, RgbaChannels>>>> = Image {
|
|
attributes: image.attributes,
|
|
|
|
// crop each layer
|
|
layer_data: {
|
|
println!("cropping layer {:#?}", image.layer_data);
|
|
|
|
// if has alpha, crop it where alpha is zero
|
|
image.layer_data
|
|
.crop_where(|(_r, _g, _b, alpha)| alpha.is_zero())
|
|
.or_crop_to_1x1_if_empty() // do not remove empty layers from image, because it could result in an image without content
|
|
},
|
|
};
|
|
|
|
image.write().to_file("cropped_rgba.exr").unwrap();
|
|
println!("cropped file to cropped_rgba.exr");
|
|
}
|
|
|