HeroicKatora on master
Exhaustively match in ColorType… Merge pull request #1848 from f… (compare)
HeroicKatora on master
feat: less restrictive FlatSamp… style: rustfmt Merge pull request #1847 from s… (compare)
FlatSamples
(there are only few helper methods here, but column_major_packed
for the common case. Otherwise you have to do this by hand, sorry.) Then you can reference that buffer as a mutable image with as_view_mut
/ViewMut
and copy over pixel by pixel. Not optimal from an ergonomics perspective but saves you from manually working out indexing schemes.
extern crate png;
use png::{Decoder, Encoder};
use std::fs::File;
use std::io::{BufReader, BufWriter};
fn main() {
let file = File::open("interview.png").unwrap();
let buff_reader = BufReader::new(file);
let decoder = Decoder::new(buff_reader);
let (info, mut reader) = decoder.read_info().unwrap();
let mut data_image = vec![0; info.buffer_size()];
// do somthing ...
reader.next_frame(&mut data_image).unwrap();
let file = File::create("interview2.png").unwrap();
let ref mut buff_writer = BufWriter::new(file);
let mut encoder = Encoder::new(buff_writer, info.width, info.height);
encoder.set_color(png::ColorType::RGBA);
encoder.set_depth(png::BitDepth::Eight);
let mut header = encoder.write_header().unwrap();
header.write_image_data(&data_image).unwrap();
}
i got error messageResult::unwrap()
on an Err
value: Format("wrong data size, expected 3714816 got 2786112")'data_image
actually has rgba color type and bit depth of eight?write_image_data
does not do the transformation of adding an alpha channel internally.
let rgb_image :RgbImage ; // ...
let img_data = rgb_image.clone().to_vec();
let w = rgb_image.width();
let h = rgb_image.height();
let png_image = vec![0;img_data.len()]; // <- how calculate len png_image ?
let ref mut buff_writer = BufWriter::new(img_data);
let mut encoder = png::Encoder::new(buff_writer, w, h);
encoder.set_color(png::ColorType::RGBA);
encoder.set_depth(png::BitDepth::Eight);
let mut header = encoder.write_header().unwrap();
header.write_image_data(&png_image).unwrap();
i use crate image and pngDynamicImage
for the conversion.let rgb_image: RgbImage = /* */
let rgba_image: RgbaImage = DynamicImage::ImageRgb8(rgb_image).into_rgba();
// .. same as you create the encoder.
png.write_image_data(&rgba_image.into_vec())?;
fn nuke_seamline_h(&self, buf: &mut Vec<u8>, image: &mut Vec<u8>, width: usize) {
let mut min_idx: usize = 0;
let mut min: u8 = 255;
let mut seam = BTreeSet::<usize>::new();
for i in (0..(buf.len()-width+1)).step_by(width) {
if buf[i] <= min {
min_idx = i;
min = buf[i];
}
}
seam.insert(min_idx);
while (min_idx + 1) % width != 0 {
let tedge = min_idx < width;
let bedge = min_idx + width >= buf.len();
let midi = min_idx+1;
let mid = buf[midi];
let bef = if !tedge { buf[midi-width] } else { 255 };
let aft = if !bedge { buf[midi+width] } else { 255 };
let mut min = bef;
let mut t_minid = midi-width;
if mid <= bef {
min = mid;
t_minid = midi;
}
if min <= aft {
min_idx = t_minid;
} else {
min_idx = midi+width;
}
seam.insert(min_idx);
}
for (rem, i) in seam.iter().enumerate() {
image.remove(*i - rem);
buf.remove(*i - rem);
}
}
image
, i.e. the buf
is always stored row-major? This would significantly affect the indexing correction in the last loop.*i - rem
it assumes that exactly rem
pixels have been removed prior to the one to-be removed in any iteration.O(width ln width)
(typically square root of your image) but you don't have to do any index correction during removal
failed to fill whole buffer
error? I try to use image
to decode a JPEG and read into a buffer, but it keeps showing me this error. I checked that the buffer length and total_bytes()
is the same, and I have no problem getting dimension and color types from the stream, so I think there are no problems in decoding.
failed to fill whole buffer
error.
djpeg
or convert -verbose
to see if any warnings or errors occur in other decoders
base64
crate before constructing a JpegDecoder?
image-tiff
repo implementing support for GeoTiff?