Low-level MozJPEG bindings for Rust

See crates.io.

This crate exposes the raw libjpeg API, so libjpeg usage manual applies. You'll most likely want to wrap it in a higher-level API :)

Requirements

Example

```rust let JPOOLIMAGE:mozjpegsys::c_int = 1;

let mut octets:Vec = Vec::new(); let width:u32; let height:u32;

let txtvec8 = nomfichiersource.intobytes(); let txt = CString::new(txtvec8).unwrap(); let mode = CString::new("rb").unwrap(); let f = libc::fopen(txt.asptr(), mode.as_ptr() );

let mut err:jpegerrormgr = mem::zeroed(); let mut cinfo: jpegdecompressstruct = mem::zeroed(); let size:sizet = mem::sizeofval(&cinfo); cinfo.common.err = mozjpegsys::jpegstderror(&mut err); mozjpegsys::jpegCreateDecompress(&mut cinfo, mozjpegsys::JPEGLIBVERSION, size); let f2 = f as *mut mozjpegsys::FILE; mozjpegsys::jpegstdiosrc(&mut cinfo, f2); mozjpegsys::jpegreadheader(&mut cinfo, true as mozjpegsys::boolean); width = cinfo.imagewidth; height = cinfo.imageheight; cinfo.outcolorspace = mozjpegsys::JCOLORSPACE::JCSEXTBGRA; mozjpegsys::jpegstartdecompress(&mut cinfo); let rowstride = (cinfo.imagewidth as i32 * cinfo.outputcomponents) as u32; let nbreoctets = (rowstride * cinfo.image_height) as usize;

octets.reserve(nbreoctets); octets.setlen(nbreoctets); let octetsptr = octets.asmutptr(); let mut octet_index:isize = 0;

let jsamparray = ((*cinfo.common.mem).allocsarray.unwrap())(&mut cinfo.common, JPOOLIMAGE, rowstride, 1); while cinfo.outputscanline < cinfo.outputheight { mozjpegsys::jpegreadscanlines(&mut cinfo, jsamparray, 1); let jsamparayptr: *const u8 = *jsamparray; for i in 0..rowstride { *octetsptr.offset(octetindex) = *jsamparayptr.offset(i as isize); octetindex += 1; } };

mozjpegsys::jpegfinishdecompress(&mut cinfo); mozjpegsys::jpegdestroydecompress(&mut cinfo); libc::fclose(f); ```

Writing:

```rust let filename = String::from("result.jpg"); let compression = 98;

let txtvec8 = filename.intobytes(); let txt = CString::new(txtvec8).unwrap(); let mode = CString::new("wb").unwrap(); let f = libc::fopen(txt.asptr(), mode.asptr() ); let mut err:jpegerrormgr = mem::zeroed(); let mut cinfo: mozjpegsys::jpegcompressstruct = mem::zeroed(); let size:sizet = mem::sizeofval(&cinfo); cinfo.common.err = mozjpegsys::jpegstderror(&mut err); mozjpegsys::jpegCreateCompress(&mut cinfo, mozjpegsys::JPEGLIBVERSION, size); let f2 = f as *mut mozjpegsys::FILE; mozjpegsys::jpegstdiodest(&mut cinfo, f2); cinfo.imagewidth = width; cinfo.imageheight = height; cinfo.inputcomponents = 4; cinfo.incolorspace = mozjpegsys::JCOLORSPACE::JCSEXTBGRA; mozjpegsys::jpegsetdefaults(&mut cinfo); let rowstride = (cinfo.imagewidth as i32 * cinfo.inputcomponents) as u32; cinfo.dctmethod = mozjpegsys::JDCTMETHOD::JDCTISLOW; mozjpegsys::jpegsetquality(&mut cinfo, compression as mozjpegsys::cint, true as mozjpegsys::boolean); let octetsptr = octets.asmutptr(); let mut octetindex:isize = 0; mozjpegsys::jpegstartcompress(&mut cinfo, true as mozjpegsys::boolean);

let jsamparraymut = ((*cinfo.common.mem).allocsarray.unwrap())(&mut cinfo.common, JPOOLIMAGE, rowstride, 1); let jsamparray = jsamparraymut as mozjpegsys::JSAMPARRAY; while cinfo.nextscanline < cinfo.imageheight { let jsamparayptr: *mut u8 = *jsamparraymut; for i in 0..rowstride { *jsamparayptr.offset(i as isize) = *octetsptr.offset(octetindex); octetindex += 1; } mozjpegsys::jpegwritescanlines(&mut cinfo, jsamparray, 1); } mozjpegsys::jpegfinishcompress(&mut cinfo); mozjpegsys::jpegdestroycompress(&mut cinfo); libc::fclose(f); ```