Análises Profundas

Como converter BMP para JPG, PNG e WebP: um guia prático

koboshiCo-founder
·8 min de leitura
Como converter BMP para JPG, PNG e WebP: um guia prático
Resumo

BMP é fácil de ler, mas pesado para armazenar. Este guia abrange ferramentas nativas do sistema operacional, workflows de linha de comando e conversão via código em cinco linguagens, para transformar BMP em JPG, PNG ou WebP com segurança.

Um BMP de 1920 × 1080 em 24 bits ocupa quase 6 MB. A mesma imagem como JPEG qualidade 90 geralmente pesa menos de 500 KB. Essa diferença de quase dez vezes explica por que arquivos BMP ainda aparecem em scanners antigos, software médico e componentes internos do Windows — e por que quase sempre precisam ser convertidos antes de irem para outro lugar.

A verdadeira vantagem do BMP é a simplicidade. Convertê-lo bem significa saber quando essa simplicidade ajuda, quando atrapalha e qual formato de destino realmente serve para o caso.

Por que o BMP ainda existe

BMP armazena pixels com sobrecarga mínima de cabeçalho. Sem tabelas Huffman, sem máquina de estados DEFLATE, sem subamostragem cromática. Para sistemas embarcados, ferramentas legadas do Windows e qualquer situação em que "ler o cabeçalho, copiar os bytes" seja todo o requisito, isso é uma vantagem real.

Essas mesmas limitações são o motivo de ele ter saído do uso cotidiano:

  • Sem compressão efetiva. BMPs descompactados são enormes. Variantes RLE existem, mas raramente superam codecs modernos.
  • Sem canal alfa confiável. O byte alfa do BMP de 32 bits tem suporte inconsistente entre ferramentas.
  • Ordem de linhas de baixo para cima. A maioria dos BMPs armazena as linhas da parte inferior da imagem para cima, o que adiciona uma pequena etapa de conversão para qualquer processo que espere dados de cima para baixo.
  • Sem ecossistema de metadados. Sem EXIF, sem suporte a perfil ICC no cabeçalho clássico, sem animação.

Para arquivamento ou compatibilidade, o BMP ainda serve. Para web, e-mail, mobile ou eficiência de armazenamento, é melhor convertê-lo para outro formato.

Escolhendo o formato de saída certo

Antes de executar um comando ou escrever código, decida o que você está otimizando.

DestinoUse quandoCompromisso
JPGFotografias, visualizações, qualquer exibição em telaCom perda, mas arquivos pequenos
PNGGráficos, capturas de tela, qualquer coisa que precise de transparênciaSem perda, maior que JPG para fotos
WebPWeb moderna, apps, onde a largura de banda importaMenor que JPG/PNG, amplo suporte em navegadores

Se você está convertendo um documento escaneado com texto e diagramas, PNG mantém as bordas nítidas. Se for uma foto de um dispositivo antigo, JPG ou WebP é a escolha certa. Para entrega web, WebP geralmente ganha em tamanho.

Nossos conversores no navegador BMP to JPG, BMP to PNG e BMP to WebP cobrem os três casos e processam tudo localmente — o arquivo não sai do seu dispositivo.

Convertendo no Windows

Paint

  1. Abra o BMP no Paint.
  2. Escolha Arquivo > Salvar como.
  3. Selecione Imagem JPEG, Imagem PNG ou Imagem WebP.
  4. Salve.

O Paint serve para arquivos avulsos. Não oferece controle de qualidade nem opção em lote, então não é útil para pastas inteiras de imagens.

PowerShell (ImageMagick)

Instale o ImageMagick pelo instalador oficial e execute:

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

Conversão em lote em uma pasta:

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

PowerShell sem ferramentas externas

O Windows 10 e 11 incluem a pilha de imagem .NET. Funciona para BMP para JPG e PNG, mas não para WebP sem uma biblioteca extra:

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

Convertendo no macOS

Visualização

  1. Abra o BMP no Visualização.
  2. Escolha Arquivo > Exportar.
  3. Selecione o formato no menu suspenso.
  4. Ajuste a qualidade para JPEG, se necessário.

A Visualização é rápida e privada, mas como o Paint, só processa um arquivo por vez.

Terminal com sips

sips é integrado ao macOS e suporta BMP, JPEG, PNG e TIFF:

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

WebP requer ImageMagick ou cwebp do pacote Homebrew webp:

brew install webp

# cwebp não lê BMP diretamente, então converta para PNG primeiro
sips -s format png input.bmp --out temp.png
cwebp temp.png -o output.webp
rm temp.png

Loop shell em lote

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

Convertendo no Linux

ImageMagick

sudo apt install imagemagick

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

Ajuste a qualidade JPEG:

magick input.bmp -quality 90 output.jpg

Conversão em lote

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

Se você precisar apenas da saída WebP mais compacta possível, use cwebp diretamente:

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

Convertendo com código

Quando você precisa de conversão dentro de um aplicativo, pipeline ou serviço backend, usar uma biblioteca geralmente é mais limpo do que chamar o ImageMagick via shell.

TypeScript / Node.js

Use sharp. Ele lida com entradas BMP e gera JPG, PNG e 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")

No navegador, você não pode executar sharp. Nosso conversor BMP to WebP usa WebAssembly para decodificar e codificar inteiramente no cliente.

PHP

PHP possui funções de imagem integradas se a extensão GD estiver 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

A biblioteca padrão do Go não lê BMP, mas golang.org/x/image/bmp lê. Para saída, use image/jpeg, image/png e 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 e WebP seguem o mesmo padrão com png.Encode e webp.Encode.

Java

O ImageIO do Java lê BMP nativamente. Para saída WebP, você precisa de uma biblioteca como webp-imageio ou bindings 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 controle mais fino da qualidade JPEG, use a API JPEGImageWriteParam.

Python

Com Pillow, Python é a forma mais direta de converter BMP para qualquer formato comum.

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 preservar a transparência ao converter para PNG, não force a conversão para RGB:

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

Armadilhas comuns

  • BMPs indexados. BMPs de 8 bits ou menos usam uma paleta. Alguns decodificadores retornam índices de paleta em vez de valores RGB se você não converter explicitamente. No Pillow, img.convert("RGB") resolve isso antes de salvar como JPEG ou WebP.
  • Orientação de baixo para cima. A maioria das bibliotecas lida com isso automaticamente, mas se você escrever um decodificador BMP manual, lembre-se de que um campo de altura positivo significa que as linhas são armazenadas de baixo para cima.
  • Qualidade JPEG padrão. Muitas ferramentas usam 75–80 como padrão. Para fotos que serão visualizadas em tela cheia, 90 é mais seguro. Para miniaturas, 70–80 está bom.
  • Compatibilidade WebP. WebP tem excelente suporte em navegadores, mas ainda falha em alguns visualizadores de imagens desktop antigos. Se o destino for um app nativo do Windows, PNG ou JPG são mais seguros.

O que usar onde

  • Arquivos legados: mantenha o BMP original. Armazenamento é barato; perder a versão canônica não é.
  • Uploads web: converta para WebP. Se precisar de fallback, mantenha uma cópia JPG.
  • Fluxos de impressão ou edição: PNG mantém a imagem sem perda e evita artefatos de compressão.
  • E-mail e mensagens: JPG é o formato universal mais seguro.

Se você prefere uma solução prática sem instalar programas nem usar a linha de comando, experimente nossos conversores BMP to JPG, BMP to PNG e BMP to WebP. Tudo roda no navegador, então o arquivo permanece na sua máquina do início ao fim.

Mais posts do blog