Sé que debe haber alguna herramienta pero somos programadores y nada mejor que hacer tus propias herramientas aunque siempre dicen por ahí «Para que reinventar la rueda»
Comenzamos creando una aplicación en consola en visual studio, en mi casa tengo net 8.
En primer paso agregamos la referencia que ayuda a trabajar con imagenes, recordemos que net 8 es multiplataforma y muchas librerias que usabamos eran nativas de windows y estas ya no son válidas.

Creamos la función Ya que requerimos los argumentos
static void Main(string[] args)<br> {<br><br>}
Agregamos la primer validación
if (args.Length == 0)
{
Console.WriteLine("No se proporcionó ninguna imagen.");
return;
}
Añadimos un array string de las extensiones permitidas:
string[] formatosPermitidos = { ".png", ".jpg", ".jpeg", ".bmp", ".webp" };
Agregamos un bucle for ya que podremos convertir múltiples imagenes posteriormente obtenemos la extensión y hacemos una validación
foreach (string inputPath in args)
{
string extension = Path.GetExtension(inputPath).ToLower();
if (!formatosPermitidos.Contains(extension))
{
Console.WriteLine($"Formato no admitido: {inputPath}");
continue;
}
Finalmente hacemos la conversión donde hacemos las decodificaciones y conversiones, en mi caso establecí el valor de comprensión al 85 % por default ya que esta herramienta la uso para contenido para redes sociales, el blog y no me es relevante la calidad si no que sea ligera.
- Esta funcionalidad mantiene su tamaño.
- Guarda en la misma ruta
- Rápido y práctico, sin tantas opciones
string outputPath = Path.ChangeExtension(inputPath, ".jpg");
try
{
using (SKBitmap bitmap = SKBitmap.Decode(inputPath))
using (SKImage image = SKImage.FromBitmap(bitmap))
using (SKData data = image.Encode(SKEncodedImageFormat.Jpeg, 85))
// Escribimos el archivo en la misma ruta.
using (FileStream fs = File.OpenWrite(outputPath))
{
data.SaveTo(fs);
}
Console.WriteLine($"Conversión exitosa: {outputPath}");
}
catch (Exception ex)
{
Console.WriteLine($"Error al convertir {inputPath}: {ex.Message}");
}
Código completo:
using SkiaSharp;
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("No se proporcionó ninguna imagen.");
return;
}
string[] formatosPermitidos = { ".png", ".jpg", ".jpeg", ".bmp", ".webp" };
foreach (string inputPath in args)
{
string extension = Path.GetExtension(inputPath).ToLower();
if (!formatosPermitidos.Contains(extension))
{
Console.WriteLine($"Formato no admitido: {inputPath}");
continue;
}
string outputPath = Path.ChangeExtension(inputPath, ".jpg");
try
{
using (SKBitmap bitmap = SKBitmap.Decode(inputPath))
using (SKImage image = SKImage.FromBitmap(bitmap))
using (SKData data = image.Encode(SKEncodedImageFormat.Jpeg, 85))
using (FileStream fs = File.OpenWrite(outputPath))
{
data.SaveTo(fs);
}
Console.WriteLine($"Conversión exitosa: {outputPath}");
}
catch (Exception ex)
{
Console.WriteLine($"Error al convertir {inputPath}: {ex.Message}");
}
}
}
}
Compilación/Publicación
Para publicar hay dos opciones, una dependiente del framework que se tenga instalado en el sistema y otra con todo el framework, en mi caso podría escoger la primera sin embargo pensando en distribuir y no hagamos instalar nada a los usuarios
Publish con Deployment mode en Self-contained, Target runtime: win-x64
Algo así:

Posteriormente copiamos o usamos la misma ruta del contenido de la carpeta «win-x64» que es donde esta nuestro archivo .exe
Creamos un archivo .bat con el siguiente contenido y cambiamos la ruta donde hayan guardado el .exe:
@echo off
:: Ruta donde está tu ejecutable
set "RutaExe=N:\Herramientas\ConvertToJpgTool\ConvertToJpgTool.exe"
:: Añadir clave en el registro
reg add "HKEY_CLASSES_ROOT\*\shell\Convertir a JPG" /ve /t REG_SZ /d "Convertir a JPG" /f
reg add "HKEY_CLASSES_ROOT\*\shell\Convertir a JPG\command" /ve /t REG_SZ /d "\"%RutaExe%\" \"%1\"" /f
echo Opción 'Convertir a JPG' agregada al menú contextual con éxito.
pause
Ejecutan como administrador y ya deberían tener la opción:

Si no les aparece, la ruta esta mal, en mi caso fallaba por que no se podía añadir el segundo parámetro que es «%1», intenté de múltiples maneras poner los simbolos de escape y no tuve éxito, por eso lo edite en regedit:
"N:\Herramientas\ConvertToJpgTool\ConvertToJpgTool.exe" "%1"

Les dejo link del proyecto: