Question

Je charge un Bitmap à partir d'un fichier jpg.Si l'image n'est pas RVB 24 bits, j'aimerais la convertir.La conversion devrait être assez rapide.Les images que je charge sont énormes (9 000 x 9 000 pixels avec une taille compressée de 40 à 50 Mo).Comment cela peut-il être fait?

D'ailleurs:Je ne souhaite pas utiliser de bibliothèques externes si possible.Mais si vous connaissez une classe d'utilitaires open source effectuant les tâches d'imagerie les plus courantes, je serais heureux d'en entendre parler.Merci d'avance.

Était-ce utile?

La solution

Le jpeg devrait commencer par 0xFF 0xD8. Après cela, vous trouverez différents champs dans le format suivant:

  1. identificateur de champ 2 octets
  2. La longueur du champ, hors identificateur de champ. 2 octets.
  3. Les données variables.

Parse à travers les champs. L'identifiant que vous serez à la recherche est 0xFF 0xC0. On appelle cela SOF0 et contient hauteur, largeur, profondeur de bits, etc. 0xFF 0xC0 sera suivi de deux octets pour la longueur du champ. Immédiatement après ce sera un seul octet indiquant la profondeur de bit, qui sera généralement 8. Ensuite, il y aura deux octets pour la hauteur, la largeur de deux, et un seul octet pour le nombre de composants; ce sera généralement 1 (pour échelle de gris) ou 3. (pour la couleur)

Autres conseils

Ce n'est pas quelque chose que j'ai essayé moi-même, mais je pense que vous devrez peut-être accéder aux informations EXIF ​​​​de l'image pour commencer.

Consultez l'entrée de blog de Scott Hanselman sur l'accès aux informations EXIF ​​​​à partir d'images.

espace de noms System.Drawing standard .NET devrait avoir tout ce dont vous avez besoin, mais il ne sera probablement pas très efficace. Il va charger le tout dans la RAM, décompressez, le convertir (probablement en faisant une copie) puis recompresser et enregistrez-le. Si vous visez pour la haute performance, je crains que vous pourriez avoir besoin de regarder dans les bibliothèques C / C ++ et .NET faire wrappers pour eux.

Pour autant que je sais jpg est toujours 24 BPP. La seule chose qui pourrait changer serait que c'est CMY (K?) Plutôt que RGB. Ces informations seraient stockées dans l'en-tête. Malheureusement, je ne dispose d'aucun moyen de créer une image CMJN pour vérifier si le chargement dans un Bitmap convertira automatiquement.

La ligne suivante va lire le fichier en mémoire:

Bitmap image = Image.FromFile(fileName);

image.PixelFormat vous indiquera le format d'image. Cependant, je ne peux pas tester ce que la charge de fichiers fait avec des fichiers autres que 24bpp RVB jpgs. Je ne peux que recommander que vous l'essayer.

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