Bitmap en grayscale (win32)

Soyez le premier à donner votre avis sur cette source.

Vue 6 180 fois - Téléchargée 404 fois

Description

Applique un effet GrayScale (niveaux de gris) sur un bitmap.

Comment procède-t-on?
On doit d?abord récupérer les 3 composantes du pixel (Blue, Green, Red). Puis on doit effectuer une moyenne des composantes.
On pourrait faire 1/3*R + 1/3*G + 1/3*B, ce qui implique que le rouge, le vert et le bleu apparaissent avec la même intensité, ce qui est incorrect.
En effet cette équation représente l?intensité du pixel et reflète mal la perception que l?homme a du rouge, du vert et du bleu.
Ainsi il existe un standard de conversion plus exact, à savoir : 0.299*R + 0.587*G + 0.114*B (méthode basée sur la luminance du modèle YUV, comme pour les téles N&B).
On répète ainsi cette étape pour chaque pixel, et on obtient alors un résultat assez probant.

Voir la capture d'écran pour un exemple avec mon chat :)
Codé en C/WIN32, compilé sous VS.NET 2003, testé sous XP.

Source / Exemple :


void DrawGrayScale()
{
  int i;
  BYTE r, g, b, y;
  for(i = 0; i < cxDib * cyDib; i++) {
    b = pbitsbmp[i * 3]; // Blue
    g = pbitsbmp[i * 3 + 1]; // Green
    r = pbitsbmp[i * 3 + 2]; // Red
    y = (306 * r + 601 * g + 117 * b) >> 10; // 0.299 * r + 0.587 * g + 0.114 * b
    pbitsbmp[i * 3] = y;
    pbitsbmp[i * 3 + 1] = y;
    pbitsbmp[i * 3 + 2] = y;		
  }
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Même pas besoin, il y a le code en preview
Messages postés
780
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
16 avril 2009
1
Que dire... bourmarsel télécharge la source et constate les faits par toi-même.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
299*1.024=306
587*1.024=601
114*1.024=117

C'est ce qu'a fait urgo et ca ne change quasiment rien (l'équation de départ est aussi sans doute deja une approximation)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est juste une approximation bien sur, les différences sont sans doutes invisibles
Messages postés
300
Date d'inscription
jeudi 12 juin 2003
Statut
Membre
Dernière intervention
9 juillet 2008
1
la seule solution c'est de multiplier les coefficients par 1.024 (1024/1000) pour avoir une division par 1024. et tu te trouveras avec un calcul plus penalisant en rapidité.
(j'ai pas telechargé la source...j'espere que l'auteur n'a pas fait une mise à jour pour mettre ce que tu lui as proposé)
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.