mirror of
				https://github.com/webmproject/libwebp.git
				synced 2025-10-31 02:15:42 +01:00 
			
		
		
		
	img2webp: convert a sequence of images to an animated webp
Usage:
  img2webp [file-level options] [image files...] [per-frame options...]
File-level options (only used at the start of compression):
 -min_size ............ minimize size
 -loop <int> .......... loop count (default: 0, = infinite loop)
 -kmax <int> .......... maximum number of frame between key-frames
                        (0=only keyframes)
 -kmin <int> .......... minimum number of frame between key-frames
                        (0=disable key-frames altogether)
 -mixed ............... use mixed lossy/lossless automatic mode
 -v ................... verbose mode
 -h ................... this help
Per-frame options (only used for subsequent images input):
 -d <int> ............. frame duration in ms (default: 100)
 -lossless  ........... use lossless mode (default)
 -lossy ... ........... use lossy mode
 -q <float> ........... quality
 -m <int> ............. method to use
example: img2webp -loop 2 in0.png -lossy in1.jpg
                  -d 80 in2.tiff -o out.webp
Change-Id: I23771b90eaf0660f420d7ffd304e704155386286
			
			
This commit is contained in:
		| @@ -6,6 +6,7 @@ project(libwebp C) | ||||
| option(WEBP_BUILD_CWEBP "Build the cwebp command line tool." OFF) | ||||
| option(WEBP_BUILD_DWEBP "Build the dwebp command line tool." OFF) | ||||
| option(WEBP_BUILD_GIF2WEBP "Build the gif2webp conversion tool." OFF) | ||||
| option(WEBP_BUILD_IMG2WEBP "Build the img2webp animation tool." OFF) | ||||
| option(WEBP_EXPERIMENTAL_FEATURES "Build with experimental features." OFF) | ||||
| option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces." OFF) | ||||
|  | ||||
| @@ -95,7 +96,8 @@ foreach(I_FILE RANGE ${WEBP_SIMD_FILES_TO_INCLUDE_RANGE}) | ||||
| endforeach() | ||||
|  | ||||
| # Build the executables if asked for. | ||||
| if(WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP OR WEBP_BUILD_GIF2WEBP) | ||||
| if(WEBP_BUILD_CWEBP OR WEBP_BUILD_DWEBP OR | ||||
|    WEBP_BUILD_GIF2WEBP OR WEBP_BUILD_IMG2WEBP) | ||||
|   # Example utility library. | ||||
|   set(exampleutil_SRCS | ||||
|     ${CMAKE_CURRENT_SOURCE_DIR}/examples/stopwatch.h | ||||
| @@ -174,3 +176,14 @@ if(WEBP_BUILD_GIF2WEBP) | ||||
|     ${WEBP_DEP_LIBRARIES} ${WEBP_DEP_IMG_LIBRARIES} | ||||
|   ) | ||||
| endif() | ||||
|  | ||||
| if(WEBP_BUILD_IMG2WEBP) | ||||
|   # img2webp | ||||
|   include_directories(${WEBP_DEP_IMG_INCLUDE_DIRS}) | ||||
|   set(IMG2WEBP_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/examples/img2webp.c) | ||||
|   parse_Makefile_am(${CMAKE_CURRENT_SOURCE_DIR}/src/mux "IMG2WEBP_SRCS") | ||||
|   add_executable(img2webp ${IMG2WEBP_SRCS}) | ||||
|   target_link_libraries(img2webp imagedec webp exampleutil imageioutil | ||||
|     ${WEBP_DEP_LIBRARIES} ${WEBP_DEP_IMG_LIBRARIES} | ||||
|   ) | ||||
| endif() | ||||
|   | ||||
| @@ -331,7 +331,8 @@ ex: $(OUT_LIBS) | ||||
| all: ex | ||||
| !ELSE | ||||
| OUT_EXAMPLES = $(DIRBIN)\cwebp.exe $(DIRBIN)\dwebp.exe | ||||
| EXTRA_EXAMPLES = $(DIRBIN)\vwebp.exe $(DIRBIN)\webpmux.exe | ||||
| EXTRA_EXAMPLES = $(DIRBIN)\vwebp.exe $(DIRBIN)\webpmux.exe \ | ||||
|                  $(DIRBIN)\img2webp.exe | ||||
|  | ||||
| ex: $(OUT_LIBS) $(OUT_EXAMPLES) | ||||
| all: ex $(EXTRA_EXAMPLES) | ||||
| @@ -355,6 +356,10 @@ $(DIRBIN)\vwebp.exe: $(DIROBJ)\examples\vwebp.obj $(EX_UTIL_OBJS) | ||||
| $(DIRBIN)\vwebp.exe: $(IMAGEIO_UTIL_OBJS) $(LIBWEBPDEMUX) $(LIBWEBP) | ||||
| $(DIRBIN)\webpmux.exe: $(DIROBJ)\examples\webpmux.obj $(LIBWEBPMUX) | ||||
| $(DIRBIN)\webpmux.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBP) | ||||
| $(DIRBIN)\img2webp.exe: $(DIROBJ)\examples\img2webp.obj $(LIBWEBPMUX) | ||||
| $(DIRBIN)\img2webp.exe: $(IMAGEIO_DEC_OBJS) | ||||
| $(DIRBIN)\img2webp.exe: $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS) $(LIBWEBP) | ||||
|  | ||||
| $(OUT_EXAMPLES): $(EX_UTIL_OBJS) $(LIBWEBP) | ||||
| $(EX_UTIL_OBJS) $(IMAGEIO_UTIL_OBJS): $(OUTPUT_DIRS) | ||||
| $(IMAGEIO_DEC_OBJS) $(IMAGEIO_ENC_OBJS): $(OUTPUT_DIRS) | ||||
|   | ||||
							
								
								
									
										31
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								README
									
									
									
									
									
								
							| @@ -413,6 +413,37 @@ $ make -f makefile.unix examples/vwebp | ||||
| > nmake /f Makefile.vc CFG=release-static \ | ||||
|     ../obj/x64/release-static/bin/vwebp.exe | ||||
|  | ||||
| Animation creation tool: | ||||
| ======================== | ||||
| The utility 'img2webp' can turn a sequence of input images (PNG, JPEG, ...) | ||||
| into an animated WebP file. It offers fine control over duration, encoding | ||||
| modes, etc. | ||||
|  | ||||
| Usage: | ||||
|  | ||||
|   img2webp [file-level options] [image files...] [per-frame options...] | ||||
|  | ||||
| File-level options (only used at the start of compression): | ||||
|  -min_size ............ minimize size | ||||
|  -loop <int> .......... loop count (default: 0, = infinite loop) | ||||
|  -kmax <int> .......... maximum number of frame between key-frames | ||||
|                         (0=only keyframes) | ||||
|  -kmin <int> .......... minimum number of frame between key-frames | ||||
|                         (0=disable key-frames altogether) | ||||
|  -mixed ............... use mixed lossy/lossless automatic mode | ||||
|  -v ................... verbose mode | ||||
|  -h ................... this help | ||||
|  | ||||
| Per-frame options (only used for subsequent images input): | ||||
|  -d <int> ............. frame duration in ms (default: 100) | ||||
|  -lossless  ........... use lossless mode (default) | ||||
|  -lossy ... ........... use lossy mode | ||||
|  -q <float> ........... quality | ||||
|  -m <int> ............. method to use | ||||
|  | ||||
| example: img2webp -loop 2 in0.png -lossy in1.jpg | ||||
|                   -d 80 in2.tiff -o out.webp | ||||
|  | ||||
| Animated GIF conversion: | ||||
| ======================== | ||||
| Animated GIF files can be converted to WebP files with animation using the | ||||
|   | ||||
							
								
								
									
										20
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -368,6 +368,26 @@ model { | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     img2webp_example(NativeExecutableSpec) { | ||||
|       binaries { | ||||
|         all { | ||||
|           lib library: "example_util", linkage: "static" | ||||
|           lib library: "imagedec", linkage: "static" | ||||
|           lib library: "imageio_util", linkage: "static" | ||||
|           lib library: "webpmux", linkage: "static" | ||||
|           lib library: "webp" | ||||
|         } | ||||
|       } | ||||
|       sources { | ||||
|         c { | ||||
|           source { | ||||
|             srcDir "./examples" | ||||
|             include "img2webp.c" | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   tasks { | ||||
|     // Task to test all possible configurations. | ||||
|   | ||||
| @@ -556,6 +556,11 @@ AS_IF([test "x$enable_gif" != "xno"], [ | ||||
| AM_CONDITIONAL([BUILD_ANIMDIFF], [test "${build_animdiff}" = "yes"]) | ||||
| AM_CONDITIONAL([BUILD_GIF2WEBP], [test "${build_gif2webp}" = "yes"]) | ||||
|  | ||||
| if test "$enable_libwebpmux" = "yes"; then | ||||
|   build_img2webp=yes | ||||
| fi | ||||
| AM_CONDITIONAL([BUILD_IMG2WEBP], [test "${build_img2webp}" = "yes"]) | ||||
|  | ||||
| dnl === check for WIC support === | ||||
|  | ||||
| AC_ARG_ENABLE([wic], | ||||
| @@ -710,6 +715,7 @@ dwebp : yes | ||||
| GIF support : ${gif_support-no} | ||||
| anim_diff   : ${build_animdiff-no} | ||||
| gif2webp    : ${build_gif2webp-no} | ||||
| img2webp    : ${build_img2webp-no} | ||||
| webpmux     : ${enable_libwebpmux-no} | ||||
| vwebp       : ${build_vwebp-no} | ||||
| ]) | ||||
|   | ||||
| @@ -64,3 +64,19 @@ LOCAL_STATIC_LIBRARIES := example_util imageio_util webpmux webp | ||||
| LOCAL_MODULE := webpmux_example | ||||
|  | ||||
| include $(BUILD_EXECUTABLE) | ||||
|  | ||||
| ################################################################################ | ||||
| # img2webp | ||||
|  | ||||
| include $(CLEAR_VARS) | ||||
|  | ||||
| LOCAL_SRC_FILES := \ | ||||
|     img2webp.c \ | ||||
|  | ||||
| LOCAL_CFLAGS := $(WEBP_CFLAGS) | ||||
| LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src | ||||
| LOCAL_STATIC_LIBRARIES := example_util imageio_util imagedec webpmux webp | ||||
|  | ||||
| LOCAL_MODULE := img2webp_example | ||||
|  | ||||
| include $(BUILD_EXECUTABLE) | ||||
|   | ||||
| @@ -7,6 +7,9 @@ endif | ||||
| if BUILD_GIF2WEBP | ||||
|   bin_PROGRAMS += gif2webp | ||||
| endif | ||||
| if BUILD_IMG2WEBP | ||||
|   bin_PROGRAMS += img2webp | ||||
| endif | ||||
| if WANT_MUX | ||||
|   bin_PROGRAMS += webpmux | ||||
| endif | ||||
| @@ -56,6 +59,13 @@ webpmux_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) | ||||
| webpmux_LDADD  = libexample_util.la ../imageio/libimageio_util.la | ||||
| webpmux_LDADD += ../src/mux/libwebpmux.la ../src/libwebp.la | ||||
|  | ||||
| img2webp_SOURCES = img2webp.c | ||||
| img2webp_CPPFLAGS = $(AM_CPPFLAGS) $(USE_EXPERIMENTAL_CODE) | ||||
| img2webp_LDADD  = libexample_util.la ../imageio/libimageio_util.la | ||||
| img2webp_LDADD += ../imageio/libimagedec.la | ||||
| img2webp_LDADD += ../src/mux/libwebpmux.la ../src/libwebp.la | ||||
| img2webp_LDADD += $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) | ||||
|  | ||||
| if BUILD_LIBWEBPDECODER | ||||
|   anim_diff_LDADD += ../src/libwebpdecoder.la | ||||
|   vwebp_LDADD += ../src/libwebpdecoder.la | ||||
|   | ||||
							
								
								
									
										285
									
								
								examples/img2webp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								examples/img2webp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,285 @@ | ||||
| // Copyright 2016 Google Inc. All Rights Reserved. | ||||
| // | ||||
| // Use of this source code is governed by a BSD-style license | ||||
| // that can be found in the COPYING file in the root of the source | ||||
| // tree. An additional intellectual property rights grant can be found | ||||
| // in the file PATENTS. All contributing project authors may | ||||
| // be found in the AUTHORS file in the root of the source tree. | ||||
| // ----------------------------------------------------------------------------- | ||||
| // | ||||
| //  generate an animated WebP out of a sequence of images | ||||
| //  (PNG, JPEG, ...) | ||||
| // | ||||
| //  Example usage: | ||||
| //     img2webp -o out.webp -q 40 -mixed -duration 40 input??.png | ||||
| // | ||||
| // Author: skal@google.com (Pascal Massimino) | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H | ||||
| #include "webp/config.h" | ||||
| #endif | ||||
|  | ||||
| #include "../examples/example_util.h" | ||||
| #include "../imageio/image_dec.h" | ||||
| #include "../imageio/imageio_util.h" | ||||
| #include "./stopwatch.h" | ||||
| #include "webp/encode.h" | ||||
| #include "webp/mux.h" | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| static void Help(void) { | ||||
|   printf("Usage:\n\n"); | ||||
|   printf("  img2webp [file-level options] [image files...] " | ||||
|          "[per-frame options...]\n"); | ||||
|   printf("\n"); | ||||
|  | ||||
|   printf("File-level options (only used at the start of compression):\n"); | ||||
|   printf(" -min_size ............ minimize size\n"); | ||||
|   printf(" -loop <int> .......... loop count (default: 0, = infinite loop)\n"); | ||||
|   printf(" -kmax <int> .......... maximum number of frame between key-frames\n" | ||||
|          "                        (0=only keyframes)\n"); | ||||
|   printf(" -kmin <int> .......... minimum number of frame between key-frames\n" | ||||
|          "                        (0=disable key-frames altogether)\n"); | ||||
|   printf(" -mixed ............... use mixed lossy/lossless automatic mode\n"); | ||||
|   printf(" -v ................... verbose mode\n"); | ||||
|   printf(" -h ................... this help\n"); | ||||
|   printf("\n"); | ||||
|  | ||||
|   printf("Per-frame options (only used for subsequent images input):\n"); | ||||
|   printf(" -d <int> ............. frame duration in ms (default: 100)\n"); | ||||
|   printf(" -lossless  ........... use lossless mode (default)\n"); | ||||
|   printf(" -lossy ... ........... use lossy mode\n"); | ||||
|   printf(" -q <float> ........... quality\n"); | ||||
|   printf(" -m <int> ............. method to use\n"); | ||||
|  | ||||
|   printf("\n"); | ||||
|   printf("example: img2webp -loop 2 in0.png -lossy in1.jpg\n" | ||||
|          "                  -d 80 in2.tiff -o out.webp\n"); | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| static int ReadImage(const char filename[], WebPPicture* const pic) { | ||||
|   const uint8_t* data = NULL; | ||||
|   size_t data_size = 0; | ||||
|   WebPImageReader reader; | ||||
|   int ok; | ||||
|   if (!ImgIoUtilReadFile(filename, &data, &data_size)) return 0; | ||||
|   reader = WebPGuessImageReader(data, data_size); | ||||
|   ok = reader(data, data_size, pic, 1, NULL); | ||||
|   free((void*)data); | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| static int SetLoopCount(int loop_count, WebPData* const webp_data) { | ||||
|   int ok = 1; | ||||
|   WebPMuxError err; | ||||
|   WebPMuxAnimParams new_params; | ||||
|   WebPMux* const mux = WebPMuxCreate(webp_data, 1); | ||||
|   if (mux == NULL) return 0; | ||||
|  | ||||
|   err = WebPMuxGetAnimationParams(mux, &new_params); | ||||
|   ok = (err == WEBP_MUX_OK); | ||||
|   if (ok) { | ||||
|     new_params.loop_count = loop_count; | ||||
|     err = WebPMuxSetAnimationParams(mux, &new_params); | ||||
|     ok = (err == WEBP_MUX_OK); | ||||
|   } | ||||
|   if (ok) { | ||||
|     WebPDataClear(webp_data); | ||||
|     err = WebPMuxAssemble(mux, webp_data); | ||||
|     ok = (err == WEBP_MUX_OK); | ||||
|   } | ||||
|   WebPMuxDelete(mux); | ||||
|   if (!ok) { | ||||
|     fprintf(stderr, "Error during loop-count setting\n"); | ||||
|   } | ||||
|   return ok; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
|  | ||||
| int main(int argc, char* argv[]) { | ||||
|   const char* output = NULL; | ||||
|   WebPAnimEncoder* enc = NULL; | ||||
|   int verbose = 0; | ||||
|   int pic_num = 0; | ||||
|   int duration = 100; | ||||
|   int timestamp_ms = 0; | ||||
|   int ok = 1; | ||||
|   int loop_count = 0; | ||||
|   int width = 0, height = 0; | ||||
|   WebPAnimEncoderOptions anim_config; | ||||
|   WebPConfig config; | ||||
|   WebPPicture pic; | ||||
|   WebPData webp_data; | ||||
|   int c; | ||||
|   int have_input = 0; | ||||
|  | ||||
|   WebPDataInit(&webp_data); | ||||
|   if (!WebPAnimEncoderOptionsInit(&anim_config) || | ||||
|       !WebPConfigInit(&config) || | ||||
|       !WebPPictureInit(&pic)) { | ||||
|     fprintf(stderr, "Library version mismatch!\n"); | ||||
|     return 1; | ||||
|   } | ||||
|  | ||||
|   // 1st pass of option parsing | ||||
|   for (c = 1; ok && c < argc; ++c) { | ||||
|     if (argv[c][0] == '-') { | ||||
|       int parse_error = 0; | ||||
|       if (!strcmp(argv[c], "-o") && c + 1 < argc) { | ||||
|         argv[c] = NULL; | ||||
|         output = argv[++c]; | ||||
|       } else if (!strcmp(argv[c], "-kmin") && c + 1 < argc) { | ||||
|         argv[c] = NULL; | ||||
|         anim_config.kmin = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|       } else if (!strcmp(argv[c], "-kmax") && c + 1 < argc) { | ||||
|         argv[c] = NULL; | ||||
|         anim_config.kmax = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|       } else if (!strcmp(argv[c], "-loop") && c + 1 < argc) { | ||||
|         argv[c] = NULL; | ||||
|         loop_count = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|         if (loop_count < 0) { | ||||
|           fprintf(stderr, "Invalid non-positive loop-count (%d)\n", loop_count); | ||||
|           parse_error = 1; | ||||
|         } | ||||
|       } else if (!strcmp(argv[c], "-min_size")) { | ||||
|         anim_config.minimize_size = 1; | ||||
|       } else if (!strcmp(argv[c], "-mixed")) { | ||||
|         anim_config.allow_mixed = 1; | ||||
|         config.lossless = 0; | ||||
|       } else if (!strcmp(argv[c], "-v")) { | ||||
|         verbose = 1; | ||||
|       } else if (!strcmp(argv[c], "-h") || !strcmp(argv[c], "-help")) { | ||||
|         Help(); | ||||
|         return 0; | ||||
|       } else { | ||||
|         continue; | ||||
|       } | ||||
|       ok = !parse_error; | ||||
|       if (!ok) goto End; | ||||
|       argv[c] = NULL;   // mark option as 'parsed' during 1st pass | ||||
|     } else { | ||||
|       have_input |= 1; | ||||
|     } | ||||
|   } | ||||
|   if (!have_input) { | ||||
|     fprintf(stderr, "No input file(s) for generating animation!\n"); | ||||
|     return 0; | ||||
|   } | ||||
|  | ||||
|   // image-reading pass | ||||
|   pic_num = 0; | ||||
|   for (c = 1; ok && c < argc; ++c) { | ||||
|     if (argv[c] == NULL) continue; | ||||
|     if (argv[c][0] == '-') {    // parse local options | ||||
|       int parse_error = 0; | ||||
|       if (!strcmp(argv[c], "-lossy")) { | ||||
|         if (!anim_config.allow_mixed) config.lossless = 0; | ||||
|       } else if (!strcmp(argv[c], "-lossless")) { | ||||
|         if (!anim_config.allow_mixed) config.lossless = 1; | ||||
|       } else if (!strcmp(argv[c], "-q") && c + 1 < argc) { | ||||
|         config.quality = ExUtilGetFloat(argv[++c], &parse_error); | ||||
|       } else if (!strcmp(argv[c], "-m") && c + 1 < argc) { | ||||
|         config.method = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|       } else if (!strcmp(argv[c], "-d") && c + 1 < argc) { | ||||
|         duration = ExUtilGetInt(argv[++c], 0, &parse_error); | ||||
|         if (duration <= 0) { | ||||
|           fprintf(stderr, "Invalid negative duration (%d)\n", duration); | ||||
|           parse_error = 1; | ||||
|         } | ||||
|       } else { | ||||
|         parse_error = 1;   // shouldn't be here. | ||||
|         fprintf(stderr, "Unknown option [%s]\n", argv[c]); | ||||
|       } | ||||
|       ok = !parse_error; | ||||
|       if (!ok) goto End; | ||||
|       continue; | ||||
|     } | ||||
|  | ||||
|     if (ok) { | ||||
|       ok = WebPValidateConfig(&config); | ||||
|       if (!ok) { | ||||
|         fprintf(stderr, "Invalid configuration.\n"); | ||||
|         goto End; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // read next input image | ||||
|     ok = ReadImage(argv[c], &pic); | ||||
|     if (!ok) goto End; | ||||
|  | ||||
|     if (enc == NULL) { | ||||
|       width  = pic.width; | ||||
|       height = pic.height; | ||||
|       enc = WebPAnimEncoderNew(width, height, &anim_config); | ||||
|       ok = (enc != NULL); | ||||
|       if (!ok) { | ||||
|         fprintf(stderr, "Could not create WebPAnimEncoder object.\n"); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (ok) { | ||||
|       ok = (width == pic.width && height == pic.height); | ||||
|       if (!ok) { | ||||
|         fprintf(stderr, "Frame #%d dimension mismatched! " | ||||
|                         "Got %d x %d. Was expecting %d x %d.\n", | ||||
|                 pic_num, pic.width, pic.height, width, height); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if (ok) { | ||||
|       ok = WebPAnimEncoderAdd(enc, &pic, timestamp_ms, &config); | ||||
|       if (!ok) { | ||||
|         fprintf(stderr, "Error while adding frame #%d\n", pic_num); | ||||
|       } | ||||
|     } | ||||
|     WebPPictureFree(&pic); | ||||
|     if (!ok) goto End; | ||||
|  | ||||
|     if (verbose) { | ||||
|       fprintf(stderr, "Added frame #%3d at time %4d (file: %s)\n", | ||||
|               pic_num, timestamp_ms, argv[c]); | ||||
|     } | ||||
|     timestamp_ms += duration; | ||||
|     ++pic_num; | ||||
|   } | ||||
|  | ||||
|   // add a last fake frame to signal the last duration | ||||
|   ok = ok && WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL); | ||||
|   ok = ok && WebPAnimEncoderAssemble(enc, &webp_data); | ||||
|   if (!ok) { | ||||
|     fprintf(stderr, "Error during final animation assembly.\n"); | ||||
|   } | ||||
|  | ||||
|  End: | ||||
|   // free resources | ||||
|   WebPAnimEncoderDelete(enc); | ||||
|  | ||||
|   if (ok && loop_count > 0) {  // Re-mux to add loop count. | ||||
|     ok = SetLoopCount(loop_count, &webp_data); | ||||
|   } | ||||
|  | ||||
|   if (ok) { | ||||
|     if (output != NULL) { | ||||
|       ok = ImgIoUtilWriteFile(output, webp_data.bytes, webp_data.size); | ||||
|       if (ok) fprintf(stderr, "output file: %s     ", output); | ||||
|     } else { | ||||
|       fprintf(stderr, "[no output file specified]   "); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (ok) { | ||||
|     fprintf(stderr, "[%d frames, %u bytes].\n", | ||||
|             pic_num, (unsigned int)webp_data.size); | ||||
|   } | ||||
|  | ||||
|   WebPDataClear(&webp_data); | ||||
|   return ok ? 0 : 1; | ||||
| } | ||||
| @@ -326,7 +326,7 @@ OUT_LIBS += src/libwebp.a | ||||
| EXTRA_LIB = extras/libwebpextras.a | ||||
| OUT_EXAMPLES = examples/cwebp examples/dwebp | ||||
| EXTRA_EXAMPLES = examples/gif2webp examples/vwebp examples/webpmux \ | ||||
|                  examples/anim_diff | ||||
|                  examples/anim_diff examples/img2webp | ||||
| OTHER_EXAMPLES = extras/get_disto extras/webp_quality | ||||
|  | ||||
| OUTPUT = $(OUT_LIBS) $(OUT_EXAMPLES) | ||||
| @@ -374,6 +374,7 @@ examples/dwebp: examples/dwebp.o | ||||
| examples/gif2webp: examples/gif2webp.o $(GIFDEC_OBJS) | ||||
| examples/vwebp: examples/vwebp.o | ||||
| examples/webpmux: examples/webpmux.o | ||||
| examples/img2webp: examples/img2webp.o | ||||
|  | ||||
| examples/anim_diff: examples/libanim_util.a examples/libgifdec.a | ||||
| examples/anim_diff: src/demux/libwebpdemux.a examples/libexample_util.a | ||||
| @@ -401,6 +402,10 @@ examples/vwebp: EXTRA_LIBS += $(GL_LIBS) | ||||
| examples/vwebp: EXTRA_FLAGS += -DWEBP_HAVE_GL | ||||
| examples/webpmux: examples/libexample_util.a imageio/libimageio_util.a | ||||
| examples/webpmux: src/mux/libwebpmux.a src/libwebpdecoder.a | ||||
| examples/img2webp: examples/libexample_util.a imageio/libimageio_util.a | ||||
| examples/img2webp: imageio/libimagedec.a | ||||
| examples/img2webp: src/mux/libwebpmux.a src/libwebp.a | ||||
| examples/img2webp: EXTRA_LIBS += $(CWEBP_LIBS) | ||||
|  | ||||
| extras/get_disto: extras/get_disto.o | ||||
| extras/get_disto: imageio/libimagedec.a | ||||
| @@ -428,7 +433,8 @@ dist: all | ||||
| 	$(INSTALL) -m644 src/demux/libwebpdemux.a $(DESTDIR)/lib | ||||
| 	$(INSTALL) -m644 src/mux/libwebpmux.a $(DESTDIR)/lib | ||||
| 	umask 022; \ | ||||
| 	for m in man/[cdv]webp.1 man/gif2webp.1 man/webpmux.1; do \ | ||||
| 	for m in man/[cdv]webp.1 man/gif2webp.1 man/webpmux.1 \ | ||||
|                  man/img2webp.1; do \ | ||||
| 	  basenam=$$(basename $$m .1); \ | ||||
| 	  $(GROFF) -t -e -man -T utf8 $$m \ | ||||
| 	    | $(COL) -bx >$(DESTDIR)/doc/$${basenam}.txt; \ | ||||
|   | ||||
							
								
								
									
										97
									
								
								man/img2webp.1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								man/img2webp.1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,97 @@ | ||||
| .\"                                      Hey, EMACS: -*- nroff -*- | ||||
| .TH IMG2WEBP 1 "December 1, 2016" | ||||
| .SH NAME | ||||
| img2webp \- create animated WebP file from a sequence of input images. | ||||
| .SH SYNOPSIS | ||||
| .B img2webp | ||||
| .R [file_level_options] [files] [per_frame_options...] | ||||
| .br | ||||
| .SH DESCRIPTION | ||||
| This manual page documents the | ||||
| .B img2webp | ||||
| command. | ||||
| .PP | ||||
| \fBimg2webp\fP compresses a sequence of images using the animated WebP format. | ||||
| Input images can either be PNG, JPEG, TIFF or WebP. | ||||
| .SH FILE-LEVEL OPTIONS | ||||
| The file-level options are applied at the beginning of the compression process, | ||||
| before the input frames are read. | ||||
| .TP | ||||
| .BI \-o " string | ||||
| Specify the name of the output WebP file. | ||||
| .TP | ||||
| .BI \-min_size | ||||
| Encode images to achieve smallest size. This disables key frame insertion and | ||||
| picks the parameters resulting in smallest output for each frame. It uses | ||||
| lossless compression by default, but can be combined with \-q, \-m, \-lossy or | ||||
| \-mixed options. | ||||
| .TP | ||||
| .BI \-kmin " int | ||||
| .TP | ||||
| .BI \-kmax " int | ||||
| Specify the minimum and maximum distance between consecutive key frames | ||||
| (independently decodable frames) in the output animation. The tool will insert | ||||
| some key frames into the output animation as needed so that this criteria is | ||||
| satisfied. | ||||
| .br | ||||
| .B \-mixed | ||||
| Mixed compression mode: optimize compression of the image by picking either | ||||
| lossy or lossless compression for each frame heuristically. This global | ||||
| option disables the local option \fB-lossy\fP and \fB-lossless\fP . | ||||
| .TP | ||||
| .BI \-loop " int | ||||
| Specifies the number of times the animation should loop. Using '0' means | ||||
| 'loop indefinitely'. | ||||
| .TP | ||||
| .BI \-v | ||||
| Be more verbose. | ||||
| .TP | ||||
| .B \-h, \-help | ||||
| A short usage summary. | ||||
|  | ||||
| .SH PER-FRAME OPTIONS | ||||
| The per-frame options are applied for the images following as arguments in the | ||||
| command line. They can be modified any number of times preceding each particular | ||||
| input image. | ||||
| .TP | ||||
| .BI \-d " int | ||||
| Specify the image duration in milliseconds. | ||||
| .TP | ||||
| .B \-lossless, \-lossy | ||||
| Compress the next image(s) using lossless or lossy compression mode. The | ||||
| default mode is lossless. | ||||
| .TP | ||||
| .BI \-q " float | ||||
| Specify the compression factor between 0 and 100. The default is 75. | ||||
| .TP | ||||
| .BI \-m " int | ||||
| Specify the compression method to use. This parameter controls the | ||||
| trade off between encoding speed and the compressed file size and quality. | ||||
| Possible values range from 0 to 6. Default value is 4. | ||||
|  | ||||
| .SH EXAMPLE | ||||
| img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp | ||||
| .br | ||||
|  | ||||
| .SH BUGS | ||||
| Please report all bugs to the issue tracker: | ||||
| https://bugs.chromium.org/p/webp | ||||
| .br | ||||
| Patches welcome! See this page to get started: | ||||
| http://www.webmproject.org/code/contribute/submitting\-patches/ | ||||
|  | ||||
| .SH AUTHORS | ||||
| \fBimg2webp\fP is a part of libwebp and was written by the WebP team. | ||||
| .br | ||||
| The latest source tree is available at | ||||
| https://chromium.googlesource.com/webm/libwebp | ||||
| .PP | ||||
| This manual page was written by Pascal Massimino <pascal.massimino@gmail.com>, | ||||
| for the Debian project (and may be used by others). | ||||
|  | ||||
| .SH SEE ALSO | ||||
| .BR webpmux (1), | ||||
| .BR gif2webp (1) | ||||
| .br | ||||
| Please refer to http://developers.google.com/speed/webp/ for additional | ||||
| information. | ||||
		Reference in New Issue
	
	Block a user