Skip to content

Instantly share code, notes, and snippets.

@kujirahand
Created March 7, 2023 05:25
Show Gist options
  • Save kujirahand/0301f9ade3952c1d0b79d30910929dc7 to your computer and use it in GitHub Desktop.
Save kujirahand/0301f9ade3952c1d0b79d30910929dc7 to your computer and use it in GitHub Desktop.
Bitmap writer for Rust
use std::io::Write;
fn main() { // メイン処理 --- (*1)
let data = make_bitmap(8, 8); // 画像を作成
let mut f = std::fs::File::create("test.bmp").unwrap(); // ファイル生成
f.write(&data).unwrap(); // ファイルに書き出す
println!("画像を書き出しました。");
}
// ビットマップ画像データを作成する --- (*2)
fn make_bitmap(width: u32, height: u32) -> Vec<u8> {
let mut data = vec![];
let image_size = width * height * 3; // サイズ計算 --- (*3)
let filesize = 14 + 40 + image_size; //
// ファイルヘッダを書き込む --- (*4)
data.push('B' as u8); data.push('M' as u8);
write_u32(&mut data, filesize); // ファイルサイズ
write_u32(&mut data, 0); // 0
write_u32(&mut data, 0x36); // 先頭から画像データまでのオフセット
// 情報ヘッダを書き込む --- (*5)
write_u32(&mut data, 40); // ヘッダサイズ
write_u32(&mut data, width); // 幅
write_u32(&mut data, height); // 高さ
write_u16(&mut data, 1); // 1
write_u16(&mut data, 24); // 色ビット数
write_u32(&mut data, 0); // 圧縮形式
write_u32(&mut data, image_size); // 画像データサイズ
write_u32(&mut data, 0); // 水平解像度(0も可/96dpi=3780)
write_u32(&mut data, 0); // 垂直解像度(0も可/96dpi=3780)
write_u32(&mut data, 0); // パレット数
write_u32(&mut data, 0); // 重要色数(0でも良い)
// 画像データを書き込む --- (*6)
for y in 0..height {
for x in 0..width {
let color = if (x+y) % 2 == 0 { 0xFF0000 } else { 0xFFFFFF };
write_rgb(&mut data, color);
}
}
data
}
fn write_u16(data: &mut Vec<u8>, v: u16) { // u16を書き込む --- (*7)
for i in v.to_le_bytes() { data.push(i); }
}
fn write_u32(data: &mut Vec<u8>, v: u32) { // u32を書き込む
for i in v.to_le_bytes() { data.push(i); }
}
fn write_rgb(data: &mut Vec<u8>, rgb: u32) { // RGBを書き込む --- (*8)
data.push((rgb >> 0 & 0xFF) as u8); // Blue
data.push((rgb >> 8 & 0xFF) as u8); // Green
data.push((rgb >> 16 & 0xFF) as u8); // Red
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment