Approfondimenti

Come convertire BMP in JPG, PNG e WebP: una guida pratica

koboshiCo-founder
·8 min di lettura
Come convertire BMP in JPG, PNG e WebP: una guida pratica
Riepilogo

BMP è facile da leggere ma ingombrante da archiviare. Questa guida copre strumenti nativi, flussi da riga di comando e conversione con codice in cinque linguaggi, così puoi trasformare BMP in JPG, PNG o WebP in modo pratico e sicuro.

Un BMP 1920 × 1080 a 24 bit occupa quasi 6 MB. La stessa immagine come JPEG qualità 90 pesa solitamente meno di 500 KB. È questo divario di circa dieci a uno il motivo per cui i file BMP si trovano ancora in vecchi scanner, software medici e componenti interni di Windows — e per cui quasi sempre vanno convertiti prima di essere usati altrove.

Il vero vantaggio di BMP è la semplicità. Convertirlo bene significa sapere quando questa semplicità aiuta, quando diventa un limite e quale formato target si adatta davvero al lavoro.

Perché BMP esiste ancora

BMP memorizza i pixel con un overhead di intestazione minimo. Nessuna tabella Huffman, nessuna macchina a stati DEFLATE, nessun sottocampionamento cromatico. Per sistemi embedded, strumenti Windows legacy e qualsiasi situazione in cui "leggi l'intestazione, copia i byte" sia l'intero requisito, questa semplicità è davvero utile.

Sono proprio queste limitazioni ad averlo spinto fuori dall'uso quotidiano:

  • Nessuna compressione efficace. I BMP non compressi sono enormi. Esistono varianti RLE, ma battono raramente i codec moderni.
  • Nessun canale alfa affidabile. Il byte alfa del BMP a 32 bit è supportato in modo incoerente tra gli strumenti.
  • Ordine delle righe dal basso verso l'alto. La maggior parte dei BMP memorizza le righe dal basso dell'immagine verso l'alto, il che aggiunge un piccolo passaggio di conversione per qualsiasi processo che si aspetti dati dall'alto verso il basso.
  • Nessun ecosistema di metadati. Nessun EXIF, nessun supporto profilo ICC nell'intestazione classica, nessuna animazione.

Per archiviazione o compatibilità, BMP va bene. Per web, email, mobile o efficienza di archiviazione, deve diventare qualcos'altro.

Scegliere il formato di output corretto

Prima di eseguire un comando o scrivere codice, decidi cosa stai ottimizzando.

DestinazioneUsalo quandoCompromesso
JPGFotografie, anteprime, qualsiasi visualizzazione su schermoCon perdita, ma file molto piccoli
PNGGrafica, screenshot, qualsiasi cosa con trasparenzaSenza perdita, più grande di JPG per le foto
WebPWeb moderno, app, dove conta la larghezza di bandaPiù piccolo di JPG/PNG, ampio supporto browser

Se stai convertendo un documento scannerizzato con testo e diagrammi, PNG mantiene i bordi nitidi. Se è una foto da un dispositivo datato, JPG o WebP è la scelta giusta. Per la distribuzione web, WebP solitamente vince in termini di dimensioni.

I nostri convertitori nel browser — BMP to JPG, BMP to PNG e BMP to WebP — coprono tutti e tre gli scenari in locale: il file non lascia il tuo dispositivo.

Convertire su Windows

Paint

  1. Apri il BMP in Paint.
  2. Scegli File > Salva con nome.
  3. Seleziona Immagine JPEG, Immagine PNG o Immagine WebP.
  4. Salva.

Paint va bene per file singoli. Non offre controllo sulla qualità né opzioni batch, quindi non è pratico per cartelle piene di immagini.

PowerShell (ImageMagick)

Installa ImageMagick dal sito ufficiale, poi:

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

Conversione batch in una cartella:

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

PowerShell senza strumenti esterni

Windows 10 e 11 includono lo stack di imaging .NET. Funziona per BMP a JPG e PNG, ma non per WebP senza una libreria aggiuntiva:

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

Convertire su macOS

Anteprima

  1. Apri il BMP in Anteprima.
  2. Scegli File > Esporta.
  3. Seleziona il formato dal menu a discesa.
  4. Se necessario, regola la qualità per JPEG.

Anteprima è veloce e riservata, ma come Paint elabora un solo file alla volta.

Terminale con sips

sips è integrato in macOS e supporta BMP, JPEG, PNG e TIFF:

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

WebP richiede ImageMagick o cwebp dal pacchetto Homebrew webp:

brew install webp

# cwebp non legge direttamente il BMP, quindi converti prima in PNG
sips -s format png input.bmp --out temp.png
cwebp temp.png -o output.webp
rm temp.png

Ciclo shell batch

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

Convertire su Linux

ImageMagick

sudo apt install imagemagick

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

Regola la qualità JPEG:

magick input.bmp -quality 90 output.jpg

Conversione batch

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

Se ti serve solo l'output WebP più piccolo possibile, usa direttamente cwebp:

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

Convertire con il codice

Quando devi convertire immagini dentro un'applicazione, una pipeline o un servizio backend, chiamare una libreria è solitamente più pulito che lanciare ImageMagick da shell.

TypeScript / Node.js

Usa sharp. Accetta BMP in input e produce 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")

Nel browser, dove sharp non è disponibile, il nostro convertitore BMP to WebP utilizza WebAssembly per decodificare e codificare completamente lato client.

PHP

PHP ha funzioni di immagine integrate se l'estensione GD è abilitata.

<?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 libreria standard di Go non legge BMP, ma golang.org/x/image/bmp sì. Per l'output usa 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 seguono lo stesso modello con png.Encode e webp.Encode.

Java

ImageIO di Java legge BMP nativamente. Per l'output WebP serve una libreria come webp-imageio o binding 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);
    }
}

Per un controllo più fine della qualità JPEG, usa l'API JPEGImageWriteParam.

Python

Con Pillow, Python è il modo più diretto per convertire BMP nei formati più comuni.

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)

Per conservare la trasparenza in uscita come PNG, non forzare la conversione RGB:

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

Trappole comuni

  • BMP indicizzati. I BMP a 8 bit o inferiori usano una tavolozza. Alcuni decoder restituiscono indici di tavolozza invece di valori RGB se non converti esplicitamente. In Pillow, img.convert("RGB") risolve il problema prima di salvare come JPEG o WebP.
  • Orientamento dal basso verso l'alto. La maggior parte delle librerie lo gestisce automaticamente, ma se scrivi un decoder BMP manuale, ricorda che un campo altezza positivo significa che le righe sono memorizzate dal basso verso l'alto.
  • Qualità JPEG predefinita. Molti strumenti usano 75–80 come predefinito. Per foto visualizzate a schermo intero, 90 è più sicuro. Per le miniature, 70–80 vanno bene.
  • Compatibilità WebP. WebP ha un ottimo supporto browser, ma fallisce ancora in alcuni visualizzatori di immagini desktop datati. Se la destinazione è un'app nativa Windows, PNG o JPG sono più sicuri.

Cosa usare dove

  • Archivi legacy: conserva il BMP originale. Lo storage è economico; perdere la versione canonica no.
  • Caricamenti web: converti in WebP. Se serve un fallback, tieni una copia JPG.
  • Flussi di stampa o montaggio: PNG rimane senza perdita ed evita artefatti di compressione.
  • Email e messaggistica: JPG è il formato universale più sicuro.

Se preferisci evitare installazioni, riga di comando e caricamenti su server, puoi usare i nostri convertitori BMP to JPG, BMP to PNG e BMP to WebP. Tutto viene eseguito nel browser, quindi il file resta sul tuo computer per tutto il processo.

Altri post del blog da leggere