1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
mod write_test;
#[cfg(feature = "v1_18")]
mod v1_18 {
use libheif_rs::{
regions, CompressionFormat, EncoderQuality, EncodingOptions, HeifContext, LibHeif, Result,
};
use super::*;
#[test]
fn write_and_read_regions() -> Result<()> {
let width = 640;
let height = 480;
let image = write_test::create_image(width, height)?;
let lib_heif = LibHeif::new();
let mut ctx = HeifContext::new()?;
let mut encoder = lib_heif.encoder_for_format(CompressionFormat::Av1)?;
encoder.set_quality(EncoderQuality::LossLess)?;
let encoding_options: EncodingOptions = Default::default();
let mut handle = ctx.encode_image(&image, &mut encoder, Some(encoding_options))?;
assert_eq!(handle.width(), width);
assert_eq!(handle.height(), height);
let mut region_item = handle.add_region_item(300, 200)?;
region_item.add_point(1, 2)?;
region_item.add_ellipse(3, 4, 5, 6)?;
region_item.add_polygon(&[(7, 8), (9, 10), (11, 12)])?;
region_item.add_polyline(&[(13, 14), (15, 16), (17, 18)])?;
region_item.add_rectangle(regions::Rectangle {
left: 19,
top: 20,
width: 21,
height: 22,
})?;
let bytes = ctx.write_to_bytes()?;
// Read the result file and check regions
let ctx = HeifContext::read_from_bytes(&bytes)?;
let handle = ctx.primary_image_handle()?;
assert_eq!(handle.width(), width);
assert_eq!(handle.height(), height);
let region_items = handle.region_items();
assert_eq!(region_items.len(), 1);
let region_item = ®ion_items[0];
let regions = region_item.regions();
assert_eq!(regions.len(), 5);
assert!(matches!(
®ions[0],
regions::Region::Point(region) if region.point() == (1, 2)
));
let expected = regions::Ellipse {
x: 3,
y: 4,
x_radius: 5,
y_radius: 6,
};
assert!(matches!(
®ions[1],
regions::Region::Ellipse(region) if region.ellipse() == expected
));
assert!(matches!(
®ions[2],
regions::Region::Polygon(region) if region.polygon_points() == [(7, 8), (9, 10), (11, 12)]
));
assert!(matches!(
®ions[3],
regions::Region::Polyline(region) if region.polyline_points() == [(13, 14), (15, 16), (17, 18)]
));
let expected = regions::Rectangle {
left: 19,
top: 20,
width: 21,
height: 22,
};
assert!(matches!(
®ions[4],
regions::Region::Rectangle(region) if region.rectangle() == expected
));
Ok(())
}
}
|