convert


Converting WebP Images to PNG Using parallel and dwebp

In this post, we’ll walk through how to efficiently convert multiple WebP images to PNG format using the parallel and dwebp tools. This method is particularly useful when dealing with a large batch of images, as it leverages parallel processing to speed up the conversion.

Step 1: Install Necessary Tools

First, we need to install the webp and parallel packages. These can be installed on a Debian-based system (like Ubuntu) using the following command:

sudo apt install webp parallel
  • webp is a package that includes the dwebp tool, which is used for decoding WebP images.
  • parallel is a shell tool for executing jobs in parallel, making the conversion process faster.

Step 2: Convert WebP Images to PNG

Once the tools are installed, you can use the following command to convert all .webp files in the current directory to .png files:

parallel dwebp {} -o {.}.png ::: *.webp

Let’s break down this command:

  1. parallel: This is the GNU parallel command. It allows you to run shell commands in parallel.
  2. dwebp: This is the command-line tool to decode WebP files to other formats, like PNG.
  3. {}: This placeholder represents each input file passed to parallel.
  4. -o {.}.png: This specifies the output format. {.} removes the file extension from the input file, and .png appends the new file extension. For example, image.webp will be converted to image.png.
  5. :::: This indicates the start of the input list for parallel.
  6. *.webp: This is a wildcard pattern that matches all .webp files in the current directory.

Example

Assume you have three WebP files in your directory: image1.webp, image2.webp, and image3.webp. Running the command will convert these files to image1.png, image2.png, and image3.png respectively.

Benefits of Using parallel

  • Speed: By leveraging multiple CPU cores, parallel significantly reduces the time needed for batch processing.
  • Simplicity: Using a single command to handle all files in a directory is straightforward and minimizes the risk of manual errors.

With these steps, you can efficiently convert a large number of WebP images to PNG format, saving time and computational resources.


Bulk convert PNG images to JPG / JPEG

for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done

The command “for i in .png ; do convert “$i” “${i%.}.jpg” ; done” is a Bash script that converts all PNG files in the current directory to JPEG files.

Let’s break down this command:

  • “for i in *.png ;” is a loop that iterates over each PNG file in the current directory.
  • “$i” is the name of the current PNG file being processed.
  • “convert” is a command-line tool that is part of the ImageMagick software suite. It is used for image conversion, resizing, and manipulation.
  • “${i%.}.jpg” is the new filename that the PNG file will be converted to. The “${i%.}” syntax is used to remove the file extension from the original PNG file name, leaving just the base filename, which is then followed by “.jpg” to indicate that the new file should be a JPEG file.

In summary, this command converts each PNG file in the current directory to a JPEG file with the same base filename. For example, “example.png” would be converted to “example.jpg”. This command can be useful when you have a large number of PNG files that you need to convert to JPEG format quickly and easily.


ImageMagick: merge two images using a black and white mask

Recently, we wanted to merge two images into one using a custom black and white mask. To avoid using heavy GUI-based software, we decided to do it using the composite command of the ImageMagick package. Using the composite program, you can overlap one image over another. The command used is straightforward once you get the order of the parameters in the command line.

convert black.jpg white.jpg mask.png -composite masked.jpg;

The above command accepts four parameters:

convert "${BLACK_PART}" "${WHITE_PART}" "${MASK}" -composite "${OUTPUT}";

The first parameter (${BLACK_PART}) is the input picture you want to be placed in all black parts of the mask. The second parameter (${WHITE_PART}) is the input photo you wish to use on all white parts of the mask. The third parameter (${MASK}) is the black and white image that you will be used to merge the previous two images. The final parameter (${OUTPUT}) is the filename to write the final results.

Below we present the results of a demo we created using the above command:

The first parameter (${BLACK_PART}) is the input picture you want to be placed in all black parts of the mask.
The second parameter (${WHITE_PART}) is the input photo you wish to use on all white parts of the mask.
The third parameter (${MASK}) is the black and white image that you will be used to merge the previous two images.
The final parameter (${OUTPUT}) is the filename to write the final results.

ImageMagick apply blur to photo using a black and white mask

Recently, we were trying to apply blurriness to the frames of a video using a custom mask. Our needs would not be short of describing using geometric shapes, so we created the following image (blur.png) as a template for the blurring effect:

The above mask applies a blur effect to all black pixels and leaves all white pixels in the original image intact.

The command that we used was the following:

convert "${FILE}" -mask blur.png -blur 0x8 +mask "blur/${FILE}";

This command creates a new copy of the input file and places it into the folder named blur, so be sure to make the folder before using the above command (e.g., using the command mkdir blur).

Parameters and other information

  • -mask this flag assosiates the filename that is given with the mask of the command.
  • -blur defines the geometry that is used reduce image noise and reduce detail levels.
    To increase the blurriness you can increase the number in this variable 0x8.
  • +mask The ‘plus’ form of the operator +mask removes the mask from the input image.

The version of convert that we used for this example was the following:

Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC

Below is a result frame from a video that we processed:

Additional material

To apply it to all video frames in the folder, we used the following command to make our life easier:

find . -maxdepth 1 -type f -name "*.ppm" -exec bash -c 'FILE="$1"; convert "${FILE}" -mask blur.png -blur 0x8 +mask "blur/${FILE}";' _ '{}' \;

The above command finds all frames in the current folder and executes the convert command described above. Since FFmpeg names the frames as PPM, we used that to filter our search. The blur folder is in the same folder as the original images. To avoid processing the pictures in that folder again, we defined the -maxdepth parameter in find that prevents it from navigating into child folders of the one we are working in.