Question

J'ai un problème étrange: j'ai environ 14,5 millions d'images bitmap, censées être non compressées. J'ai besoin de convertir ces images en JPG et de les stocker dans une base de données.

Lorsque j'utilise les classes fournies dans la bibliothèque .NET System.Drawing pour enregistrer le bitmap au format ImageFormat.Jpeg, le fichier JPEG résultant correspond à deux fois la taille du bitmap d'origine. Voici le code:

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);
   }
}

J'ai examiné le HEX de plusieurs de ces images et il semble que le paramètre de compression soit "aucun". Donc, je suppose qu'ils ne sont pas compressés. De plus, le fichier HEX du fichier d'origine a le symbole "BMP". code et le fichier résultant a le code "JFIF". code comme vous le souhaiteriez.

Les images sont en noir et blanc, pas de couleurs.

Avez-vous une idée de la raison pour laquelle cela se produirait? Vous cherchez des pointeurs dans la bonne direction ...

Modifications:

  • J'ai essayé d'utiliser la surcharge alternative pour enregistrer, qui vous permet de spécifier la qualité. Aucun avantage vu.
  • Je devrais également préciser que je suis un peu coincé avec JPEG dans une certaine mesure ici. Il s’agit d’un système hérité et d’autres parties du système s’attendent au format JPEG.

Attributs d'image:

  • Dimensions bitmap: 152x48
  • Taille du fichier bitmap: 1022 octets
  • JPEG: même dimension
  • taille JPEG: 2,2 ko
  • Infos bitmap: indexé, 1 couche (2 couleurs)
  • Résolution bitmap: 96.012x 96.012 ppi
Était-ce utile?

La solution

Cela est probablement dû au fait que les images au format JPEG que vous sauvegardez sont désormais des images couleur RVB 24 bits, dans lesquelles les images bitmap sont des images noir et blanc de 1 bpp.

Si les bitmaps valent 1 bpp, jpeg n’est probablement pas le meilleur format de conversion.

Autres conseils

Noir et blanc ou niveaux de gris?

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

"JPEG fonctionne avec des images en couleur ou en niveaux de gris; il ne gère pas images à deux niveaux (noir et blanc), du moins pas bien. Il ne gère pas images colorormapped soit; vous devez pré-développer ceux-ci dans un non mappé représentation en couleur. JPEG fonctionne mieux sur "ton continu". images. Les images comportant de nombreux sauts brusques dans les valeurs de couleur ne se compresseront pas bien. "

Vous devez définir un attribut pour que le codeur lui indique le niveau de compression à utiliser.

Voir aussi

Vous souhaiterez utiliser cette surcharge de Bitmap.Save , vous pouvez donc spécifier le EncoderParameter .

En ce qui concerne la taille de vos fichiers, il se peut que votre fichier BMP ait été codé en longueur d'exécution ou que vous utilisiez un bitmap plus petit (et non 24 bits).

Comparaison des tailles pour une image 2 couleurs 61x64:

  • Fax-4 tiff: 268 octets
  • 2 couleurs bmp (comme ci-dessus): 550 octets
  • jpeg 8 bits: 1502 octets
  • jpeg 32 bits (comme le ferait System.Drawing créer): 2015 octets

Ainsi, si vous devez utiliser des fichiers JPEG, convertissez-les d'abord en 8 bits. Faire cela dans .Net sera difficile, mais il existe un exemple de code disponible dans CodeProject et d’autres.

Je voulais juste faire un suivi avec ma solution. J'ai réussi à faire en sorte que le reste du système prenne en charge les graphiques au format PNG. J'ai donc converti les bitmaps en graphiques PNG et les avons convertis 1 bit par pixel en noir et blanc. Cela les rendait petits et efficaces.

Le problème était donc que les fichiers JPG ne font tout simplement pas bien les images avec quelques couleurs.

Juste une pensée: vous dites qu'une partie de votre système a besoin que les fichiers soient des fichiers JPEG. Est-ce vraiment vrai ou faut-il simplement que les fichiers portent l'extension JPG? Si tel est le cas, vous pouvez, même si c'est moche, renommer l’extension de fichier, car les fichiers BMP de votre cas sont plus petits.

Par exemple, sous Windows, vous pouvez utiliser un fichier BMP et modifier son extension en JPG. Lorsque vous l'ouvrez, Windows s'en moque et l'affiche correctement.

Cet article kb devrait vous montrer comment faire

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top