Domanda

Sto riscontrando uno strano problema: ho circa 14,5 milioni di immagini bitmap, presumibilmente non compresse. Devo convertire queste bitmap in JPG e memorizzarle in un database.

Quando utilizzo le classi fornite nella libreria .NET System.Drawing per salvare la bitmap come ImageFormat.Jpeg, il JPEG risultante è circa due volte della dimensione della Bitmap originale. Ecco il codice:

byte[] bitmapBytes = //get from the db
using(MemoryStream bitmapStream = new MemoryStream(bitmapBytes))
{
   using(Bitmap bitmap = (Bitmap)Bitmap.FromStream(bitmapStream))
   {
       bitmap.Save("jpg.jpg", ImageFormat.Jpeg);
   }
}

Ho esaminato l'esadecimale di molte di queste immagini e sembra che l'impostazione di compressione sia "nessuna". Quindi presumo che non siano compressi. Inoltre, l'esadecimale per il file originale ha il " BMP " codice e il file risultante ha il " JFIF " codice come ti aspetteresti.

Le immagini sono in bianco e nero, senza colori.

Qualche idea sul perché ciò accada? Alla ricerca di puntatori nella giusta direzione ...

Le modifiche:

  • Ho provato a utilizzare il sovraccarico alternativo per salvare che ti consente di specificare la qualità. Nessun vantaggio visto.
  • Dovrei anche specificare che sono un po 'bloccato con JPEG in qualche modo qui. Questo è un sistema legacy e altre parti del sistema prevedono JPEG.

Attributi dell'immagine:

  • Dimensioni bitmap: 152x48
  • Dimensione file bitmap: 1022 byte
  • JPEG: stessa dimensione
  • Dimensioni JPEG: 2,2 kb
  • Informazioni bitmap: indicizzate, 1 livello (2 colori)
  • Risoluzione bitmap: 96.012x 96.012 ppi
È stato utile?

Soluzione

Probabilmente è perché le immagini jpeg che stai salvando sono ora immagini a colori RGB a 24 bit, dove le bitmap sono immagini in bianco e nero da 1 bpp.

Se le bitmap sono 1 bpp, probabilmente jpeg non è il formato migliore in cui convertirle.

Altri suggerimenti

Bianco e nero o scala di grigi?

Da http://www.faqs.org/faqs /compression-faq/part2/section-6.html :

" JPEG funziona su immagini a colori o in scala di grigi; non gestisce immagini bilevel (in bianco e nero), almeno non bene. Non gestisce neanche immagini colormapped; devi pre-espandere quelli in un non mappato rappresentazione a colori. JPEG funziona meglio su "tono continuo" immagini. Le immagini con molti salti improvvisi nei valori di colore non verranno compresse correttamente. & Quot;

Devi impostare un attributo per l'encoder per comunicargli il livello di compressione da usare.

Vedi anche

Dovrai passare a questo sovraccarico di Bitmap.Save , in modo da poter specificare EncoderParameter .

Per quanto riguarda il motivo per cui i tuoi file stanno diventando più grandi, è possibile che il tuo BMP sia stato codificato in base alla lunghezza o utilizzando una bitmap più piccola (non a 24 bit).

Un confronto di dimensioni per un'immagine 61x64 a 2 colori:

  • Fax-4 tiff: 268 byte
  • 2 colori bmp (come sopra): 550 byte
  • jpeg a 8 bit: 1502 byte
  • jpeg a 32 bit (come farebbe System.Drawing creare): 2015 byte

Quindi, se devi usare jpeg, convertili prima in 8 bit. Farlo in .Net sarà imbarazzante, ma c'è un codice di esempio disponibile su CodeProject e altri.

Volevo solo dare un seguito con la mia soluzione. Sono stato in grado di ottenere il resto del sistema per supportare la grafica in formato PNG, quindi quello che ho fatto è stato convertire le bitmap in grafica PNG e renderle 1 bit per pixel in bianco e nero. Questo li ha resi piccoli ed efficienti.

Quindi il problema era che i JPG non fanno bene le immagini a pochi colori.

Solo un pensiero: dici che parte del tuo sistema ha bisogno che i file siano file JPEG. È davvero vero o servono solo i file per avere l'estensione JPG? In tal caso, potresti - anche se è brutto - rinominare l'estensione del file, poiché i file BMP nel tuo caso sono più piccoli.

Ad esempio in Windows, puoi prendere un file BMP e modificarne l'estensione in JPG, quando lo apri, a Windows non importa e lo visualizza correttamente.

Questo articolo di kb dovrebbe mostrarti come farlo

http://support.microsoft.com/kb/324790

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top