1

Тема: Збереження гліфа зі шрифту ttf в якості png файлу

Потрібно зберегти гліф зі шрифту в якості png файлу.
Намагаюся зробити це ось так:

use fontdue;
use image;
use std::path::Path;

fn main() {
    let font = include_bytes!(
        "Шрифти/612KosheyLinePL-Bold - 612KosheyLinePL - Bold.ttf") as &[u8];
    let font = fontdue::Font::from_bytes(
        font, fontdue::FontSettings::default()).unwrap();
    
    let (metrics, bitmap) = font.rasterize('ґ', 17.0);
    let image_width: u32 = metrics.width.try_into().unwrap();
    let image_height: u32 = metrics.height.try_into().unwrap();
    println!("Image width: {}, image height: {}", image_width, image_height);
    image::save_buffer(&Path::new("image.png"), 
        &bitmap, image_width, image_height, image::ExtendedColorType::Rgba8)
        .expect("Can't save png image.");
}

Але отримую помилку:

thread 'main' panicked at .cargo/registry/src/index.crates.io-6f17d22bba15001f/image-0.25.1/src/io/free_functions.rs:69:50:
assertion `left == right` failed: Invalid buffer length: expected 384 got 96 for 8x12 image
  left: 384
  right: 96

bitmap — це Vec<u8>, save_buffer вимагає &[u8].

Розумію, що формати не збігаються, але не знаю, що з цим робити.

Подякували: leofun011

2

Re: Збереження гліфа зі шрифту ttf в якості png файлу

Спробуйте отак зберігти

    let image = GrayImage::from_raw(image_width, image_height, bitmap).unwrap();
    image.save(&Path::new("image.png")).expect("Can't save png image.");

*

use image::GrayImage;
Подякували: Teg Miles, leofun012

3

Re: Збереження гліфа зі шрифту ttf в якості png файлу

Chemist-i написав:

Спробуйте отак зберігти

    let image = GrayImage::from_raw(image_width, image_height, bitmap).unwrap();
    image.save(&Path::new("image.png")).expect("Can't save png image.");

*

use image::GrayImage;

Збереглося, але з інверсією кольорів. Тобто біла літера на чорному тлі.
Помилка була в тому, що я намагався зберегти чорно-біле зображення в кольоровому форматі?

4

Re: Збереження гліфа зі шрифту ttf в якості png файлу

Teg Miles написав:

bitmap — це Vec<u8>, save_buffer вимагає &[u8].

Може буде корисно:

Teg Miles написав:

Помилка була в тому, що я намагався зберегти чорно-біле зображення в кольоровому форматі?

Ні, помилка точно не в цьому. Chemist-i просто гарно обійшов проблему. З рештою, якщо зображеня на виході буде містити тільки 2 кольори, то чому би це не користати.

Подякували: Teg Miles1