Análisis Profundos

Cómo convertir BMP a JPG, PNG y WebP: una guía práctica

koboshiCo-founder
·8 min de lectura
Cómo convertir BMP a JPG, PNG y WebP: una guía práctica
Resumen

BMP es fácil de leer pero pesado de almacenar. Esta guía repasa herramientas nativas del sistema, flujos en línea de comandos y conversión con código en cinco lenguajes para que puedas pasar de BMP a JPG, PNG o WebP con criterio.

Un BMP de 1920 × 1080 a 24 bits ocupa casi 6 MB. La misma imagen como JPEG de calidad 90 suele pesar menos de 500 KB. Esa diferencia, aproximadamente de diez a uno, explica por qué los archivos BMP siguen apareciendo en escáneres antiguos, software médico e internos de Windows, y también por qué casi siempre hay que convertirlos antes de usarlos en otro sitio.

La verdadera ventaja de BMP es su sencillez. Convertirlo bien significa saber cuándo esa sencillez ayuda, cuándo se convierte en un obstáculo y qué formato de destino se ajusta de verdad a la tarea.

Por qué BMP sigue existiendo

BMP guarda los píxeles con un encabezado mínimo. Sin tablas Huffman, sin máquina de estados DEFLATE, sin submuestreo cromático. Para sistemas embebidos, herramientas heredadas de Windows y cualquier situación en la que todo el requisito sea "leer el encabezado, copiar los bytes", esa sencillez resulta útil.

Las mismas limitaciones son las que lo han marginado del uso cotidiano:

  • Sin compresión real. Los BMP sin comprimir son enormes. Existen variantes RLE, pero raramente superan a los códecs modernos.
  • Sin canal alfa fiable. El byte alfa del BMP de 32 bits tiene soporte inconsistente entre herramientas.
  • Orden de filas de abajo hacia arriba. La mayoría de los BMP almacenan las filas desde la parte inferior de la imagen hacia arriba, lo que añade un pequeño paso de conversión para cualquier proceso que espere datos de arriba hacia abajo.
  • Sin ecosistema de metadatos. Sin EXIF, sin soporte de perfil ICC en el encabezado clásico, sin animación.

Para archivado o compatibilidad, BMP cumple. Para web, correo, móviles o eficiencia de almacenamiento, necesita convertirse en otra cosa.

Elegir el formato de salida correcto

Antes de ejecutar un comando o escribir código, decide qué estás optimizando.

DestinoÚsalo cuandoCompromiso
JPGFotografías, vistas previas, cualquier pantallaCon pérdida, pero archivos pequeños
PNGGráficos, capturas de pantalla, lo que necesite transparenciaSin pérdida, más grande que JPG para fotos
WebPWeb moderna, apps, donde importe el ancho de bandaMás pequeño que JPG/PNG, amplio soporte en navegadores

Si conviertes un documento escaneado con texto y diagramas, PNG mantiene los bordes nítidos. Si es una foto de un dispositivo antiguo, JPG o WebP es la elección correcta. Para entrega web, WebP suele ganar en tamaño.

Nuestros convertidores BMP to JPG, BMP to PNG y BMP to WebP funcionan en el navegador y procesan el archivo localmente, así que no tienes que subirlo a ningún servidor.

Convertir en Windows

Paint

  1. Abre el BMP en Paint.
  2. Elige Archivo > Guardar como.
  3. Selecciona Imagen JPEG, Imagen PNG o Imagen WebP.
  4. Guarda.

Paint funciona para archivos sueltos. No ofrece control de calidad ni opción por lotes, así que no sirve para carpetas de imágenes.

PowerShell (ImageMagick)

Instala ImageMagick desde el instalador oficial:

magick input.bmp output.jpg
magick input.bmp output.png
magick input.bmp output.webp

Conversión por lotes en una carpeta:

Get-ChildItem *.bmp | ForEach-Object {
    magick $_.FullName ($_.BaseName + ".jpg")
}

PowerShell sin herramientas externas

Windows 10 y 11 incluyen la pila de imágenes .NET. Funciona para BMP a JPG y PNG, pero no para WebP sin una biblioteca adicional:

Add-Type -AssemblyName System.Drawing
$img = [System.Drawing.Image]::FromFile("input.bmp")
$img.Save("output.jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg)
$img.Dispose()

Convertir en macOS

Vista Previa

  1. Abre el BMP en Vista Previa.
  2. Elige Archivo > Exportar.
  3. Selecciona el formato en el menú desplegable.
  4. Ajusta la calidad para JPEG si es necesario.

Vista Previa es rápida y privada, pero al igual que Paint, solo maneja un archivo a la vez.

Terminal con sips

sips viene integrado en macOS y admite BMP, JPEG, PNG y TIFF:

sips -s format jpeg input.bmp --out output.jpg
sips -s format png input.bmp --out output.png

WebP requiere ImageMagick o cwebp del paquete Homebrew webp:

brew install webp

# cwebp no lee BMP directamente, así que convierte primero a PNG
sips -s format png input.bmp --out temp.png
cwebp temp.png -o output.webp
rm temp.png

Bucle shell por lotes

for f in *.bmp; do
    sips -s format jpeg "$f" --out "${f%.bmp}.jpg"
done

Convertir en Linux

ImageMagick

sudo apt install imagemagick

magick input.bmp output.jpg
magick input.bmp output.png
magick input.bmp output.webp

Ajustar la calidad JPEG:

magick input.bmp -quality 90 output.jpg

Conversión por lotes

for f in *.bmp; do
    magick "$f" "${f%.bmp}.jpg"
done

Si solo necesitas la salida WebP más pequeña posible, usa cwebp directamente:

for f in *.bmp; do
    cwebp -q 85 "$f" -o "${f%.bmp}.webp"
done

Conversión con código

Cuando necesitas conversión dentro de una aplicación, un pipeline o un servicio backend, llamar a una biblioteca suele ser más limpio que invocar ImageMagick desde shell.

TypeScript / Node.js

Usa sharp. Maneja entradas BMP y genera JPG, PNG y WebP.

import sharp from "sharp"

async function convertBmp(
  input: string,
  output: string,
  format: "jpg" | "png" | "webp"
) {
  await sharp(input)
    .toFormat(format, format === "jpg" ? { quality: 90 } : undefined)
    .toFile(output)
}

await convertBmp("input.bmp", "output.jpg", "jpg")
await convertBmp("input.bmp", "output.png", "png")
await convertBmp("input.bmp", "output.webp", "webp")

En el navegador no puedes ejecutar sharp. Nuestro convertidor BMP to WebP usa WebAssembly para decodificar y codificar completamente en el cliente.

PHP

PHP tiene funciones de imagen integradas si la extensión GD está habilitada.

<?php

function bmpToJpg(string $input, string $output, int $quality = 90): void {
    $image = imagecreatefrombmp($input);
    imagejpeg($image, $output, $quality);
    imagedestroy($image);
}

function bmpToPng(string $input, string $output): void {
    $image = imagecreatefrombmp($input);
    imagepng($image, $output);
    imagedestroy($image);
}

function bmpToWebp(string $input, string $output, int $quality = 90): void {
    $image = imagecreatefrombmp($input);
    imagewebp($image, $output, $quality);
    imagedestroy($image);
}

bmpToJpg("input.bmp", "output.jpg");
bmpToPng("input.bmp", "output.png");
bmpToWebp("input.bmp", "output.webp");

Go

La biblioteca estándar de Go no lee BMP, pero golang.org/x/image/bmp sí. Para la salida usa image/jpeg, image/png y golang.org/x/image/webp.

package main

import (
	"image/jpeg"
	"image/png"
	"os"

	"golang.org/x/image/bmp"
	"golang.org/x/image/webp"
)

func bmpToJpg(input, output string, quality int) error {
	f, err := os.Open(input)
	if err != nil {
		return err
	}
	defer f.Close()

	img, err := bmp.Decode(f)
	if err != nil {
		return err
	}

	out, err := os.Create(output)
	if err != nil {
		return err
	}
	defer out.Close()

	return jpeg.Encode(out, img, &jpeg.Options{Quality: quality})
}

PNG y WebP siguen el mismo patrón con png.Encode y webp.Encode.

Java

ImageIO de Java lee BMP de forma nativa. Para salida WebP necesitas una biblioteca como webp-imageio o bindings de cwebp.

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class BmpConverter {
    public static void bmpToJpg(String input, String output, float quality) throws IOException {
        BufferedImage image = ImageIO.read(new File(input));
        File out = new File(output);
        ImageIO.write(image, "jpg", out);
    }

    public static void bmpToPng(String input, String output) throws IOException {
        BufferedImage image = ImageIO.read(new File(input));
        File out = new File(output);
        ImageIO.write(image, "png", out);
    }
}

Para un control más fino de la calidad JPEG, usa la API JPEGImageWriteParam.

Python

Con Pillow, Python es la forma más directa de pasar de BMP a cualquier formato común.

from PIL import Image

with Image.open("input.bmp") as img:
    img.convert("RGB").save("output.jpg", quality=90)

with Image.open("input.bmp") as img:
    img.save("output.png")

with Image.open("input.bmp") as img:
    img.save("output.webp", quality=90)

Para conservar la transparencia al convertir a PNG, no fuerces la conversión a RGB:

with Image.open("input.bmp") as img:
    img.save("output.png")

Trampas comunes

  • BMP indexados. Los BMP de 8 bits o menos usan una paleta. Algunos decodificadores devuelven índices de paleta en lugar de valores RGB si no conviertes explícitamente. En Pillow, img.convert("RGB") resuelve esto antes de guardar como JPEG o WebP.
  • Orientación de abajo hacia arriba. La mayoría de las bibliotecas lo manejan automáticamente, pero si escribes un decodificador BMP manual, recuerda que un campo de altura positivo significa que las filas se almacenan de abajo hacia arriba.
  • Calidad JPEG predeterminada. Muchas herramientas usan 75–80 por defecto. Para fotos que se verán a pantalla completa, 90 es más seguro. Para miniaturas, 70–80 está bien.
  • Compatibilidad WebP. WebP tiene excelente soporte en navegadores, pero aún falla en algunos visores de escritorio antiguos. Si el destino es una app nativa de Windows, PNG o JPG son más seguros.

Qué usar en cada caso

  • Archivos heredados: conserva el BMP original. El almacenamiento es barato; perder la versión canónica no lo es.
  • Subidas web: convierte a WebP. Si necesitas un respaldo, conserva una copia JPG.
  • Flujos de impresión o edición: PNG mantiene la imagen sin pérdida y evita artefactos de compresión.
  • Correo y mensajería: JPG es el formato universal más seguro.

Si prefieres no instalar nada ni usar la terminal, nuestros convertidores BMP to JPG, BMP to PNG y BMP to WebP hacen la conversión directamente en el navegador, con el archivo siempre en tu equipo.

Más publicaciones del blog para leer