// SPDX-License-Identifier: LGPL-3.0-or-later
/*
* libopenraw - bin/orrender.rs
*
* Copyright (C) 2023 Hubert Figuière
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* .
*/
use getopts::Options;
use log::LevelFilter;
use simple_logger::SimpleLogger;
use libopenraw::{rawfile_from_file, Bitmap, RenderingOptions};
pub fn main() {
let args: Vec = std::env::args().collect();
let mut opts = Options::new();
opts.optflag("d", "", "Debug");
opts.optopt("o", "", "Set output file name", "OUTPUT");
let matches = match opts.parse(&args[1..]) {
Ok(m) => m,
Err(f) => panic!("{}", f.to_string()),
};
let output = matches.opt_str("o");
println!("output {output:?}");
if matches.free.is_empty() {
println!("orrender [-o OUTPUT] file");
return;
}
let loglevel = if matches.opt_present("d") {
LevelFilter::Debug
} else {
LevelFilter::Error
};
SimpleLogger::new()
.with_module_level("mp4parse", LevelFilter::Error)
.with_module_level("libopenraw", loglevel)
.init()
.unwrap();
for name in matches.free.iter() {
process_file(name, output.as_ref()).expect("Error processing");
}
}
fn process_file(p: &str, output: Option<&String>) -> libopenraw::Result<()> {
if let Ok(rawfile) = rawfile_from_file(p, None) {
log::info!("Rendering raw file {}", p);
// Default options are Colour stage + SRgb.
let options = RenderingOptions::default();
let rawdata = rawfile.raw_data(false)?;
let rendered_image = rawdata.rendered_image(options)?;
if let Some(output) = output {
let width = rendered_image.width();
let height = rendered_image.height();
if let Some(data16) = rendered_image.data16() {
let scale = u8::MAX as f64 / u16::MAX as f64;
let data8 = data16
.iter()
.map(|v| (*v as f64 * scale) as u8)
.collect::>();
log::debug!(
"orrender rgb(u8) at 1000. 1000: [{}, {}, {}]",
data8[1000 * 1000 * 3],
data8[1000 * 1000 * 3 + 1],
data8[1000 * 1000 * 3 + 2]
);
image::save_buffer_with_format(
output,
&data8,
width,
height,
image::ColorType::Rgb8,
image::ImageFormat::Png,
)
.expect("Failed to save to PNG");
}
}
}
Ok(())
}