diff --git a/src/lib.rs b/src/lib.rs index d9f7bfd..c447d8c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,7 +27,7 @@ extern crate libc; use std::ffi::CString; -use libc::{c_uint, size_t, c_double}; +use libc::{c_uint, size_t, c_double, c_void}; use filters::FilterType; mod bindings; @@ -59,10 +59,19 @@ impl MagickWand { } } - // TODO: make a Rustic wrapper for reading a blob from bytes - // pub fn MagickReadImageBlob(arg1: *mut MagickWand, - // arg2: *const ::libc::c_void, arg3: size_t) - // -> MagickBooleanType; + /// Read the image data from the vector of bytes. + pub fn read_image_blob(&self, data: Vec) -> Result<(), &'static str> { + let int_slice = &data[..]; + let size = data.len(); + let result = unsafe { + bindings::MagickReadImageBlob( + self.wand, int_slice.as_ptr() as *const c_void, size as u64) + }; + match result { + bindings::MagickTrue => Ok(()), + _ => Err("failed to read image") + } + } /// Retrieve the width of the image. pub fn get_image_width(&self) -> usize { diff --git a/tests/lib.rs b/tests/lib.rs index 0561f08..abf6bdc 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -19,6 +19,10 @@ extern crate magick_rust; use magick_rust::{MagickWand, magick_wand_genesis}; use magick_rust::filters::{FilterType}; +use std::error::Error; +use std::fs::File; +use std::io::Read; +use std::path::Path; use std::sync::{Once, ONCE_INIT}; // Used to make sure MagickWand is initialized exactly once. Note that we @@ -54,3 +58,25 @@ fn test_resize_image() { assert_eq!(256, wand.get_image_width()); assert_eq!(192, wand.get_image_height()); } + +#[test] +fn test_read_from_blob() { + START.call_once(|| { + magick_wand_genesis(); + }); + let wand = MagickWand::new(); + + let path = Path::new("tests/data/IMG_5745.JPG"); + let mut file = match File::open(&path) { + Err(why) => panic!("couldn't open file: {}", Error::description(&why)), + Ok(file) => file + }; + let mut data: Vec = Vec::new(); + match file.read_to_end(&mut data) { + Err(why) => panic!("couldn't read file: {}", Error::description(&why)), + Ok(_) => () + }; + assert!(wand.read_image_blob(data).is_ok()); + assert_eq!(512, wand.get_image_width()); + assert_eq!(384, wand.get_image_height()); +}