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 :)
```rust let JPOOLIMAGE:mozjpegsys::c_int = 1;
let mut octets:Vec
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); ```