Skip to content

Instantly share code, notes, and snippets.

@brainlessbitch
Last active March 14, 2025 06:31
Show Gist options
  • Save brainlessbitch/b7f067a3ecb4eecb11966727f010f221 to your computer and use it in GitHub Desktop.
Save brainlessbitch/b7f067a3ecb4eecb11966727f010f221 to your computer and use it in GitHub Desktop.
use std::fs::File;
use image::{
codecs::gif::{GifEncoder, Repeat},
Delay, Frame, ImageBuffer, Rgba,
};
const IMAGE_WIDTH: u32 = 88;
const IMAGE_HEIGHT: u32 = 31;
const IMAGE_FRAMES: &[&[u8]] = &[
&[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF,
0xE7, 0xFF, 0xFF, 0xFF, 0x07, 0xE6, 0x04, 0x06, 0xE6, 0x04, 0x7E, 0x60, 0x30, 0xE7, 0xFF,
0x07, 0xE4, 0x04, 0x04, 0xE4, 0x04, 0x3C, 0x20, 0x20, 0xE7, 0xFF, 0xE7, 0xE4, 0xE4, 0xE4,
0xE4, 0xE4, 0x3C, 0x27, 0x27, 0xE7, 0xFF, 0xE7, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0x3C, 0x27,
0x20, 0xE7, 0xFF, 0xE7, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0x3C, 0x27, 0x20, 0xE7, 0xFF, 0xE7,
0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0x3C, 0x27, 0x3F, 0xE2, 0xFF, 0x07, 0x04, 0xE4, 0x04, 0x04,
0xE4, 0x24, 0x20, 0x60, 0x30, 0xE0, 0x07, 0x0E, 0xE4, 0x04, 0x0E, 0xE4, 0x64, 0x60, 0xE0,
0x38, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
&[
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF,
0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF,
0xE7, 0xFF, 0xFF, 0xFF, 0x07, 0xE6, 0x04, 0x06, 0xE6, 0x04, 0x7E, 0x60, 0x30, 0xE7, 0xFF,
0x07, 0xE4, 0x04, 0x04, 0xE4, 0x04, 0x3C, 0x20, 0x20, 0xE7, 0xFF, 0xE7, 0xE4, 0xE4, 0xE4,
0xE4, 0xE4, 0x3C, 0x27, 0x27, 0xE7, 0xFF, 0xE7, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0x3C, 0x27,
0x20, 0xE7, 0xFF, 0xE7, 0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0x3C, 0x27, 0x20, 0xE7, 0xFF, 0xE7,
0xE4, 0xE4, 0xE4, 0xE4, 0xE4, 0x3C, 0x27, 0x3F, 0xE2, 0xFF, 0x07, 0x04, 0xE4, 0x04, 0x04,
0xE4, 0x24, 0x20, 0x60, 0xF0, 0xFF, 0x07, 0x0E, 0xE4, 0x04, 0x0E, 0xE4, 0x64, 0x60, 0xE0,
0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
],
];
fn main() {
let file = File::create("out.gif").unwrap();
let mut encoder = GifEncoder::new(file);
encoder.set_repeat(Repeat::Infinite).unwrap();
for frame in IMAGE_FRAMES {
let mut buffer: ImageBuffer<Rgba<u8>, Vec<u8>> =
ImageBuffer::new(IMAGE_WIDTH, IMAGE_HEIGHT);
for y in 0..IMAGE_HEIGHT {
for x in 0..IMAGE_WIDTH {
if x >= IMAGE_WIDTH || y >= IMAGE_HEIGHT {
return;
}
let byte_index = (y * IMAGE_WIDTH + x) / 8;
let byte = frame[byte_index as usize];
if (byte >> (x % 8)) & 1 == 1 {
buffer.put_pixel(x, y, Rgba([0, 0, 0, 1]));
} else {
buffer.put_pixel(x, y, Rgba([255, 255, 255, 1]));
}
}
}
encoder
.encode_frame(Frame::from_parts(
buffer,
0,
0,
Delay::from_numer_denom_ms(250, 1),
))
.unwrap();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment