salut, j'ai une image RGB, je veux transformé tous ses pixels en ajoutant la valeur alpha. comment faire ? Merci bien
salut, j'ai une image RGB, je veux transformé tous ses pixels en ajoutant la valeur alpha. comment faire ? Merci bien
Bonjour,
Il faut lire le fichier et pour chaque pixel, lui rajouter un alpha puis réecrire le fichier.
Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi
Ma page sur DVP
Mon Portfolio
Qui connaît l'erreur, connaît la solution.
Salut,
En fait, un pixel RGB n'est jamais qu'un pixel RGBA dont l'alpha serait à 100% par défaut
Tu peux donc "simplement" utiliser ta structure RGBA en donnant une valeur par défaut pour l'alpha
Les pixels sont souvent défini avec des unsigned char (uint8_t ) pour les couleurs, ce qui fait que ta structure RGBA pourrait ressembler à quelque chose comme
et tu pourrais très bien avoir une fonction d'écriture (et une de lecture) dans (respectivement depuis) un fichier n'utilisant que RGB et une autre (en fait deux autres) pour l'écriture (et la lecture) dans (respectivement depuis) un fichier utilisant RGBA, qui prendraient la forme de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 struct RGBA { RGBA(char R, char G, char B, char A = 255):red(R), green(G), blue(B), alpha(A){} unsigned char red; unsigned char green; unsigned char blue; unsigned char alpha; };
Je te laisse le soin de trouver la logique pour lire/écrire tous les pixels, mais un petit tour vers la Faq devrait te donner des directions sympa
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 RGBA readFromRgbFile(std::ifstream ifs) { unsigned char red; unsigned char green; unsigned char blue; ofs>>red>>green>>blue; return RGBA(red, green, blue); } RGBA readFromRgbAlphaFile(std::ifstream ifs) { unsigned char red; unsigned char green; unsigned char blue; unsigned char alpha; ofs>>red>>green>>blue>>alpha; return RGBA(red, green, blue,alpha); } void writeToRgbFile(std::ifstream ifs, RGBA const & rgba) { ifs<<rgba.red <<rgba.green <<rgba.blue; } void writeToRgbAlphaFile(std::ifstream ifs, RGBA const & rgba) { ifs<<rgba.red <<rgba.green <<rgba.blue <<rgba.alpha; }
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Dans l'idée oui, mais en pratique ça va dépendre du format du fichier image. D'ailleurs, il est probable que le format d'entrée ne supporte pas l'alpha par défaut (voir pas du tout), et dans ce cas l'opération n'est pas complètement triviale.
Quel format utilises-tu ? BMP, JPG, PNG, ... ?
Mais, à partir du moment où il ne s'agit que de lire le pixel, pour éventuellement convertir dans un autre format qui supporte l'alpha, tu n'as pas vraiment à t'inquiéter de ce problème.
Tu devras, effectivement, lire le fichier en respectant son format, mais, au moment de créer le tableau de pixels qui constituent ton image, tu peut parfaitement envisager de générer des pixels RGBA dont l'alpha est à 100% par défaut
C'était là le sens de ma phrase, en réalité
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Je suis bien d'accord avec ça Ce que je soulignais, c'est que ce qu'on appelle un "pixel" (i.e. la chose qui s'affiche à l'écran) peut avoir une définition très différente selon le format d'image que l'on utilise, et rajouter un canal alpha peut être simple, ou pas.
Ce que tu suggères est juste, mais à mon avis ce n'est (ne sera) pas le cœur du problème. Ceci dit, il est dur d'en juger avec le peu d'information qui a été donné...
Oh... Hé... Pour une fois que je me contente de répondre à la question sans aborder les différents problèmes qui risquent de se poser, z'allez pas vous plaindre, non plus
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
salut, voilà ce que je fait :
TColor color = Image1->Canvas->Pixels[i][j];
je récupère les valeurs RGB :
Byte R = GetRValue(color);
Byte G = GetGValue(color);
Byte B = GetBValue(color);
après je veux les affecter sur une autre image en ajoutant la valeur alpha :
SetPixel(Image2->Canvas->Handle, i, j, TColor(RGBA(R, G, B, A)) mais ça ne marche pas !?
Qu'entends-tu par "ajouter de l'alpha" ?!
Si l'image d'origine n'en a pas, ça revient à ce qu'elle soit opaque pour chaque pixel, donc 255 (ou 1).
En tous cas pas un A parachuté d'on ne sait où.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
mais la valeur du pixel en hexa est sous cette forme 0x00FFFFFF pour un blanc => 0xAARRGGBB donc comment modifier le AA en lui donnant une autre valeur que le zéro ?
Pourquoi pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part SetPixel(Image2->Canvas->Handle, i, j, TColor(RGBA(R, G, B, 255))
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Si tu nous indiquais déjà à quoi correspond TColor, car bon, la première chose à faire, c'est de s'assurer que ta couleur de "destination" supporte effectivement l'alpha
Il serait aussi intéressant de savoir quels sont les constructeus dont cette classe dispose, afin de pouvoir déterminer dans quel ordre les différentes composantes doivent être données.
Enfin, en informatique, "ca marche pas", ca ne veut strictement rien dire et c'est normal que "ca marche pas": je n'ai encore jamais vu un ordinateur avec des jambes ... Pourrais tu être un peu plus précis sur ce qui "ne marche pas"
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Merci beaucoup à tous finalement j'ai trouvé que je n’avais pas besoin de ce alpha pour l'insérer dans l'image !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager