Crates.io | riff-ani |
lib.rs | riff-ani |
version | 0.1.0 |
source | src |
created_at | 2020-11-18 16:19:14.818474 |
updated_at | 2020-11-18 16:19:14.818474 |
description | Generating the animated mouse cursor files (.ani) for Windows. |
homepage | |
repository | |
max_upload_size | |
id | 313727 |
size | 21,922 |
Generating the animated mouse cursor files (.ani) for Windows.
use riff_ani::ico::{IconDir, IconDirEntry, IconImage, ResourceType};
use riff_ani::{Ani, AniHeader};
fn main() {
let frames = vec![
"./images/1.png",
"./images/2.png",
"./images/3.png",
"./images/4.png",
];
let out = File::create("./output.ani")
.unwrap_or_else(|_| panic!("cannot create file {}", dest.to_string_lossy()));
let ani = Ani {
header: AniHeader {
num_frames: frames.len() as u32,
num_steps: frames.len() as u32,
width: 48,
height: 48,
frame_rate: 2,
},
frames: frames.iter().map(create_cur).collect(),
};
ani.encode(&out)
.unwrap_or_else(|_| panic!("cannot write file {}", dest.to_string_lossy()));
}
fn create_cur(path: &str) -> IconDir {
let mut icon_dir = IconDir::new(ResourceType::Cursor);
let file = std::fs::File::open(path)
.unwrap_or_else(|_| panic!("cannot open png {}", path));
let mut image = IconImage::read_png(file)
.unwrap_or_else(|_| panic!("cannot read png {}", path));
image.set_cursor_hotspot(Some((8, 8)));
let entry = IconDirEntry::encode_as_png(&image)
.unwrap_or_else(|_| panic!("cannot encode png {}", path));
icon_dir.add_entry(entry);
icon_dir
}
See also the docs for crate ico.