@@ -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