Created
March 7, 2023 05:25
-
-
Save kujirahand/0301f9ade3952c1d0b79d30910929dc7 to your computer and use it in GitHub Desktop.
Bitmap writer for Rust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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