Skip to content

Commit b5d6981

Browse files
committed
create WebpEncoder struct to wrap webp_write functions
1 parent da39c09 commit b5d6981

File tree

1 file changed

+102
-46
lines changed

1 file changed

+102
-46
lines changed

src/lib.rs

Lines changed: 102 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -191,61 +191,117 @@ pub fn webp_load_rgb_from_memory(buf: &[u8]) -> ImageResult<RgbImage> {
191191
Ok(ImageBuffer::from_raw(width, height, buf.to_vec()).unwrap())
192192
}
193193

194-
pub fn webp_write<W: Write>(img: &DynamicImage, w: &mut W) -> ImageResult<()> {
195-
match img {
196-
&DynamicImage::ImageRgb8(ref img) => webp_write_rgb(img, w),
197-
&DynamicImage::ImageRgba8(ref img) => webp_write_rgba(img, w),
198-
&DynamicImage::ImageBgr8(ref img) => webp_write_bgr(img, w),
199-
&DynamicImage::ImageBgra8(ref img) => webp_write_bgra(img, w),
200-
&DynamicImage::ImageLuma8(_) => webp_write_rgb(&img.to_rgb8(), w),
201-
&DynamicImage::ImageLumaA8(_) => webp_write_rgba(&img.to_rgba8(), w),
202-
&DynamicImage::ImageRgb16(_) => webp_write_rgb(&img.to_rgb8(), w),
203-
&DynamicImage::ImageRgba16(_) => webp_write_rgba(&img.to_rgba8(), w),
204-
&DynamicImage::ImageLuma16(_) => webp_write_rgb(&img.to_rgb8(), w),
205-
&DynamicImage::ImageLumaA16(_) => webp_write_rgba(&img.to_rgba8(), w),
206-
}
207-
}
208-
209-
pub fn webp_write_rgba<W: Write, C>(img: &ImageBuffer<Rgba<u8>, C>, w: &mut W) -> ImageResult<()>
210-
where
211-
C: Deref<Target = [u8]>,
212-
{
213-
let buf = libwebp::WebPEncodeRGBA(&img, img.width(), img.height(), img.width() * 4, 75.0)
194+
pub struct WebpEncoder<W: Write> {
195+
w: W,
196+
quality_factor: f32,
197+
}
198+
199+
impl<W: Write> WebpEncoder<W> {
200+
pub fn new(w: W) -> WebpEncoder<W> {
201+
Self {
202+
w,
203+
quality_factor: 0.75,
204+
}
205+
}
206+
pub fn new_with_quality(w: W, quality_factor: f32) -> WebpEncoder<W> {
207+
Self { w, quality_factor }
208+
}
209+
pub fn encode(self, img: &DynamicImage) -> ImageResult<()> {
210+
match img {
211+
DynamicImage::ImageRgb8(img) => self.encode_rgb(img),
212+
DynamicImage::ImageRgba8(img) => self.encode_rgba(img),
213+
DynamicImage::ImageBgr8(img) => self.encode_bgr(img),
214+
DynamicImage::ImageBgra8(img) => self.encode_bgra(img),
215+
DynamicImage::ImageLuma8(_) => self.encode_rgb(&img.to_rgb8()),
216+
DynamicImage::ImageLumaA8(_) => self.encode_rgba(&img.to_rgba8()),
217+
DynamicImage::ImageRgb16(_) => self.encode_rgb(&img.to_rgb8()),
218+
DynamicImage::ImageRgba16(_) => self.encode_rgba(&img.to_rgba8()),
219+
DynamicImage::ImageLuma16(_) => self.encode_rgb(&img.to_rgb8()),
220+
DynamicImage::ImageLumaA16(_) => self.encode_rgba(&img.to_rgba8()),
221+
}
222+
}
223+
224+
pub fn encode_rgb<C>(self, img: &ImageBuffer<Rgb<u8>, C>) -> ImageResult<()>
225+
where
226+
C: Deref<Target = [u8]>,
227+
{
228+
let WebpEncoder {
229+
mut w,
230+
quality_factor,
231+
} = self;
232+
let buf = libwebp::WebPEncodeRGB(
233+
&img,
234+
img.width(),
235+
img.height(),
236+
img.width() * 3,
237+
quality_factor,
238+
)
214239
.map_err(|_| EncodingError::new(ImageFormatHint::Unknown, "Webp Format Error".to_string()))
215240
.map_err(ImageError::Encoding)?;
216-
w.write_all(&buf)?;
217-
Ok(())
218-
}
241+
w.write_all(&buf)?;
242+
Ok(())
243+
}
219244

220-
pub fn webp_write_rgb<W: Write, C>(img: &ImageBuffer<Rgb<u8>, C>, w: &mut W) -> ImageResult<()>
221-
where
222-
C: Deref<Target = [u8]>,
223-
{
224-
let buf = libwebp::WebPEncodeRGB(&img, img.width(), img.height(), img.width() * 3, 75.0)
245+
pub fn encode_rgba<C>(self, img: &ImageBuffer<Rgba<u8>, C>) -> ImageResult<()>
246+
where
247+
C: Deref<Target = [u8]>,
248+
{
249+
let WebpEncoder {
250+
mut w,
251+
quality_factor,
252+
} = self;
253+
let buf = libwebp::WebPEncodeRGBA(
254+
&img,
255+
img.width(),
256+
img.height(),
257+
img.width() * 4,
258+
quality_factor,
259+
)
225260
.map_err(|_| EncodingError::new(ImageFormatHint::Unknown, "Webp Format Error".to_string()))
226261
.map_err(ImageError::Encoding)?;
227-
w.write_all(&buf)?;
228-
Ok(())
229-
}
262+
w.write_all(&buf)?;
263+
Ok(())
264+
}
230265

231-
pub fn webp_write_bgra<W: Write, C>(img: &ImageBuffer<Bgra<u8>, C>, w: &mut W) -> ImageResult<()>
232-
where
233-
C: Deref<Target = [u8]>,
234-
{
235-
let buf = libwebp::WebPEncodeBGRA(&img, img.width(), img.height(), img.width() * 4, 75.0)
266+
pub fn encode_bgr<C>(self, img: &ImageBuffer<Bgr<u8>, C>) -> ImageResult<()>
267+
where
268+
C: Deref<Target = [u8]>,
269+
{
270+
let WebpEncoder {
271+
mut w,
272+
quality_factor,
273+
} = self;
274+
let buf = libwebp::WebPEncodeBGR(
275+
&img,
276+
img.width(),
277+
img.height(),
278+
img.width() * 3,
279+
quality_factor,
280+
)
236281
.map_err(|_| EncodingError::new(ImageFormatHint::Unknown, "Webp Format Error".to_string()))
237282
.map_err(ImageError::Encoding)?;
238-
w.write_all(&buf)?;
239-
Ok(())
240-
}
283+
w.write_all(&buf)?;
284+
Ok(())
285+
}
241286

242-
pub fn webp_write_bgr<W: Write, C>(img: &ImageBuffer<Bgr<u8>, C>, w: &mut W) -> ImageResult<()>
243-
where
244-
C: Deref<Target = [u8]>,
245-
{
246-
let buf = libwebp::WebPEncodeBGR(&img, img.width(), img.height(), img.width() * 3, 75.0)
287+
pub fn encode_bgra<C>(self, img: &ImageBuffer<Bgra<u8>, C>) -> ImageResult<()>
288+
where
289+
C: Deref<Target = [u8]>,
290+
{
291+
let WebpEncoder {
292+
mut w,
293+
quality_factor,
294+
} = self;
295+
let buf = libwebp::WebPEncodeBGRA(
296+
&img,
297+
img.width(),
298+
img.height(),
299+
img.width() * 4,
300+
quality_factor,
301+
)
247302
.map_err(|_| EncodingError::new(ImageFormatHint::Unknown, "Webp Format Error".to_string()))
248303
.map_err(ImageError::Encoding)?;
249-
w.write_all(&buf)?;
250-
Ok(())
304+
w.write_all(&buf)?;
305+
Ok(())
306+
}
251307
}

0 commit comments

Comments
 (0)