C# Conversion de 8-bits ou 16-bits en niveaux de gris de pixels bruts de données
J'ai besoin d'être en mesure de convertir en 8 bits ou 16-bits en niveaux de gris des pixels des données dans un format de fichier que le .NET framework peut prendre en charge.
Les données dont je dispose est la largeur, la hauteur, l'orientation (en bas à gauche) et le format de pixel comme 4096 nuances de gris (résolution 12 bits) emballés dans 2 octets par pixel.
Ainsi, par exemple, chaque pixel varie de 0 à 4096, et chaque pixel est de 2 octets.
J'ai déjà essayé d'utiliser PixelFormat.Format16bppGrayScale à l'image du constructeur, et il jette un GDI+ exception. Tout ce que j'ai lu dit que ce format n'est pas pris en charge et que le réseau est mauvais.
Je veux convertir ce pixel buffer dans un .NET format Bitmap (comme Format32bppArgb) avec aussi peu de la qualité de l'image perte possible.
Ce que quelqu'un sait comment faire?
Reproduire avec quoi? Pouvez-vous développer?
Il suffit de dessiner chaque pixel où il est nécessaire de reproduire l'image.
OriginalL'auteur Trevor Elliott | 2011-07-26
Vous devez vous connecter pour publier un commentaire.
Voir l'exemple ci-dessous, qui précalcule une table de correspondance (LUT) et l'utilise pour convertir chaque pixel. Cette version couvre votre 12 bits de cas; pour les 8-bits, le code est très similaire, mais il est difficile de généraliser pour l'ensemble des formats de pixel.
Une conversion à partir de 12 bits GS efficacement les 8 bits GS de perdre des données. Toutefois, vous pouvez régler la LUT de la table pour se concentrer sur une petite plage de valeurs d'entrée avec un meilleur contraste (ex. DICOM Centre de la Fenêtre/la Largeur de la Fenêtre).
OriginalL'auteur lnmx
Usurper une 16b format & utiliser ColorMatrix de la carte correctement avant de l'afficher.
Je n'ai pas fait de tests de performance de cette approche sur Windows, mais sur d'autres plates-formes (par exemple, Android) où j'avais besoin d'efficace de la mémoire de stockage et rapide de reconfiguration de différentes gammes dans les 12b ou 16b données que j'ai fait bon usage de cette technique.
Je lui dis mon 12/16b niveaux de gris de données est vraiment RGB565, de sorte qu'il est heureux de la sérialisation, la désérialisation d' & d'autres manipulations. Quand j'ai besoin d'afficher je le passe à travers un ColorMatrix qui cartes la fenêtre appropriée pour une 8b niveaux de gris dans ARGB8888.
Si quelqu'un veut essayer cela, je vais poster mon algorithme de cartographie.
OriginalL'auteur Riker
De deux façons possibles:
Ensuite, utilisez LockBits; il devrait vous aider à faire exactement ce dont vous avez besoin. Vous perdre de la qualité cependant: les deux formats de pixel que vous voulez convertir à seulement 8 bits par canal. Donc vous perdrez 4 de vos 12 bits par pixel. Vous pouvez avoir beaucoup de difficulté à maintenir la qualité complète: msdn.microsoft.com/en-us/library/... dit "PixelFormat48bppRGB, [...] l'utilisation de 16 bits par canal.... GDI+ version 1.0 et 1.1 pouvez lire 16 bits par canal d'images, mais ces images sont converties en 8 bits par canal de format pour le traitement, l'affichage et l'économie."
Je suis déjà en train de l'utiliser LockBits. LockBits ne pas faire de conversion. J'ai besoin d'écrire un algorithme pour convertir dire de gris 8 bits octets à 24-bit RGB octets.
LockBits retourne un objet BitmapData. BitmapData.Scan0 est un pointeur sur la première ligne de l'image bitmap. Vous pouvez faire la conversion vous-même; si le format de pixel est de 24-bit RGB puis il suffit de configurer chacune des 3 octets pour la même valeur de gris de l'entrée bitmap.
OriginalL'auteur James Johnston