---
title: "Building a JPG/PNG to WebP Converter in PowerShell (with Google's WebP Library)"
description: "How to use PowerShell with Google's cwebp tool to batch convert JPG and PNG images to WebP, and how file sizes compare across different compression quality settings."
canonical_url: "https://blog.markkulab.net/en/post/powershell-webp-conveter"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/en/author/mark-ku"
site: "Mark Ku's Tech Notes"
date_published: "2021-08-07 01:01:01 +0800"
category: "PowerShell"
tags: ["powershell", "webp", "image", "converter", "optimization", "google", "frontend"]
language: "en"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "when reusing or quoting, credit the author and link back to the original"
---

# Building a JPG/PNG to WebP Converter in PowerShell (with Google's WebP Library)

## Origins of WebP
WebP was developed by Google. Its key advantage is delivering excellent visual clarity without bloating network payloads — which is critical for page load speed.

## Why use WebP
For most websites, images account for over 60% of page weight. WebP can shrink JPEG file size by ~35% and PNG file size by ~50% while preserving quality and transparency. Adopting WebP reduces bandwidth usage and improves user experience.

## File size comparison
### The cwebp tool defaults to 80% quality. Here's a comparison between lossless 100% and the default 80%.
1. JPG to WebP — Lossless WebP conversion actually grows the file size by roughly 2x. With the default 80% compression, however, file size drops by ~40%.
![File size comparison: JPG, lossless WebP, and 80% compressed Web](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/pcc6KNz.png)
2. PNG to WebP — Lossless WebP cuts file size by more than half. With the default 80%, files shrink by ~86%.
![Windows dialogs comparing PNG, lossless, and 80% compressed WebP file](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/1cecyod.png)  
* An interesting observation:
* The default 80% mode reduces both JPG and PNG sizes meaningfully, but the lossless 100% mode can actually double the size of a JPG.

## Browser support
A few years ago WebP support was patchy, but it's now widely supported. One thing to watch out for: iOS only added WebP support starting with version 14, so older versions need a fallback.
* [Solution for browsers without WebP support](https://medium.com/@mingjunlu/image-optimization-using-webp-72d5641213c9)  
![Can I use WebP browser support matrix by version](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/P4qSTME.png)   

## Download Google's WebP tool
https://developers.google.com/speed/webp/download  
![Google's WebP download page with a highlighted download link](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/Wke6lvo.png)

## Write the PowerShell script (Convert-WebP.ps1)

```
$libPath = $PSScriptRoot + "\libwebp-1.2.0-windows-x64\bin\cwebp.exe"
$defaultFoldPath = (Get-Item .)
$outputFolder = 'output'
Function Get-Folder([String] $initialDirectory)
{
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null

    $foldername = New-Object System.Windows.Forms.FolderBrowserDialog
    $foldername.Description = "Select a folder"
    $foldername.rootfolder = "MyComputer"
    $foldername.SelectedPath = $initialDirectory
	$foldername.ShowNewFolderButton = $false
	
    if($foldername.ShowDialog() -eq "OK")
    {		
        $folder += $foldername.SelectedPath 
    }else{
		exit		
	}
    return $folder
}


Function Conver-Webp([String] $source, [String] $output)
{	
   Write-Host ('$input path:' + $source)
   Write-Host ('$output path:' + $output)

   if (!(Test-Path -Path $output )) {
   New-Item -ItemType directory -Path $output
   Write-Host 'create new folder' + $output
   }

   $files = get-childitem $source -recurse -force -include *.jpg, *.png  
   Write-Host $files
   foreach($inputFile in $files){      
	
   #Call cwebp  
   $inputFilePath = $inputFile.FullName  
   $outputFilePath = Split-Path -Path $inputFile.FullName  
   
   $outputFilePath = $output + "\" + [System.IO.Path]::GetFileNameWithoutExtension($inputFilePath) + ".webp"  
	
   # 使用 80% 品質等級去轉換單張圖片：

   Write-Host $outputFilePath  
   $args = "-q 80 " + $inputFilePath + " -o " + $outputFilePath  
  
   Start-Process -FilePath $libPath -ArgumentList $args -Wait  
  
   $originalFileSize = (Get-Item $inputFilePath).length  
   $optimizedFileSize = (Get-Item $outputFilePath).length    
     
   $savedBytes = $originalFileSize - $optimizedFileSize  
   $savedPercentage = [math]::Round(100-($optimizedFileSize / $originalFileSize)*100)  
   $message = $inputFilePath + " " + $outputFilePath + " " + $savedBytes + "bytes " + $savedPercentage + "%"  
   
   Write-Host $message   
   } 
}


$sourceFolderPath = Get-Folder($defaultFoldPath) 
$outputFolderPath =($sourceFolderPath+ '\' + $outputFolder)

Conver-Webp $sourceFolderPath $outputFolderPath 
	  
PAUSE

```  

## Place the downloaded WebP library next to the script, then right-click Convert-WebP.ps1 > Run with PowerShell
![Windows context menu for Convert-WebP.ps1, 'Run with PowerShell' highlighted](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/wrtboP2.png)   
## Select the source folder
![Windows 'Select a folder' dialog, 'output' folder highlighted](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/V2TuSRe.png)
## Execution screen
![PowerShell execution screen showing WebP conversion progress](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/UOQZr4S.png)
## When the script finishes, all jpg/png files are written to the output directory.
![File Explorer displaying source folder containing various JPG PNG files](https://blog.markkulab.net/content/markku/posts/powershell-webp-conveter/images/JcIfmWm.png)

---

## About this article and its author

Originally published on [Mark Ku's Tech Notes](https://blog.markkulab.net/en/post/powershell-webp-conveter)

License: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — when reusing or quoting, credit the author and link back to the original

### About the author

**[Mark Ku](https://blog.markkulab.net/en/author/mark-ku)** — Software Solution Provider

- 10+ years senior software engineer, now an AI Builder
- Focused on large-platform architecture — North-American e-commerce, AI SaaS subscription billing
- Combining AI Agents and automation to build evolvable product foundations

### Free tools built by the author

All of these are free to use:

- [Free PDF Sign Tool](https://blog.markkulab.net/en/tools/pdf-sign): Online PDF sign tool — draw, type, or upload a signature, then drag, resize, and download. Everything runs in your browser; nothing is uploaded.
- [VS Code Refactory](https://blog.markkulab.net/en/tools/refactory): Refactory is a VS Code refactoring extension: 34 actions plus a 37-rule code-smell inspection layer with a Code Health dashboard, across 18 languages, backed by 534 tests. It learns your repo's conventions: where interfaces live, where DI is registered, whether 'use client' belongs. It ranks files by git churn × complexity so you know what to fix first, and hands any smell to the Claude Code already on your machine. Free to use, and your source never leaves your computer.
- [DB-Kit Database Manager](https://blog.markkulab.net/en/tools/db-kit): DB-Kit is a lightweight, cross-platform database manager built with Tauri + Rust + React. Manage MySQL, MariaDB, PostgreSQL, SQL Server, Oracle, SQLite, MongoDB, Redis, Kafka, Elasticsearch and RabbitMQ from one consistent interface: passwords encrypted in the OS keychain, SSH tunnels, full CRUD, a visual query builder, stacked multi-statement result sets, cross-connection data transfer and compare/sync, Excel / CSV import & export, visualized execution plans, ER diagrams, scheduled backups, SQL stress testing with p50–p99 latency percentiles, a 15-rule SQL review engine, Kafka message browsing with monitoring & alerts, a bilingual UI (Traditional Chinese / English), a built-in AI assistant (natural-language SQL, AI review and tuning advice) and the dbk CLI. Free and open source (MIT), with installers for Windows, macOS and Linux.
- [VS Code Super Mermaid](https://blog.markkulab.net/en/tools/super-mermaid): Super Mermaid is a VS Code extension for beautiful Mermaid diagrams out of the box: auto-colored live preview, mouse pan & zoom, high-res PNG / SVG export, 21 templates and multiple themes. Free and open source (MIT).
- [React Super Mermaid](https://blog.markkulab.net/en/tools/react-super-mermaid): react-super-mermaid is an open-source React component library: render beautiful Mermaid diagrams with a single <MermaidViewer>, with built-in colorful / sketch themes, pan & zoom, in-diagram search, and high-res SVG / PNG export. Lightweight, SSR-safe, fully typed. Free and open source (MIT).
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/en/tools/jira-super-mermaid): An Atlassian Forge app: write Mermaid syntax directly inside a Jira issue or a Confluence page and get flowcharts, sequence diagrams, state machines and Gantt charts. 11 diagram types, SVG / PNG export, light and dark themes, full CJK support. Runs on Atlassian: your diagrams live in your own site and the app calls no third-party service. Free, coming soon to the Atlassian Marketplace.
- [Mermaid Live Preview](https://blog.markkulab.net/en/tools/mermaid-preview): Write Mermaid in your browser, see it render instantly, and share the whole diagram as a single link. No sign-up, nothing uploaded to a server, and mermaid.live share links work as-is.
- [React Intl Phone Number](https://blog.markkulab.net/en/tools/react-intl-phone-number): react-intl-phone-number is an open-source React component: framework-agnostic and antd-free, with E.164 in/out, a searchable flag / country-code dropdown, configurable validation levels (strict / mobile-strict / loose), themeable CSS, and i18n — phone logic powered by google-libphonenumber. Lightweight and fully typed. Free and open source (MIT).
- [Uptime Kuma Cluster](https://blog.markkulab.net/en/tools/uptime-kuma-cluster): Turn single-node Uptime Kuma into a highly available cluster: OpenResty + Lua smart load balancing, shared MariaDB state, health checks and automatic failover, plus cluster-management REST APIs. One Docker Compose command to start. Free and open source (MIT).
- [Special Education](https://blog.markkulab.net/en/education): Learning materials crafted for special education students

### Daily podcasts

- [Mark's Tech Insights — Daily AI News](https://blog.markkulab.net/en/category/tech-news): Daily curated AI and tech trends. Catch the latest developments via audio summaries — covering AI applications, software architecture, DevOps, and engineering practice. — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/en/category/ai-stock-chat): Every trading day, an AI-analyzed take on the Taiwan stock market, delivered as a two-host conversation covering the session and the next-day outlook. — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml
- [開源好物週報](https://blog.markkulab.net/en/category/open-source-weekly): A weekly two-host pick of free open-source tools surfaced from real Hacker News, GitHub, and Reddit buzz — what pain they solve and the fastest way to get started. — RSS: https://blog.markkulab.net/open-source-weekly/feed.xml

### Newsletter

[Subscribe to the newsletter](https://blog.markkulab.net/en/subscribe) — Be the first to know about new posts. No spam, unsubscribe anytime.
