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 çaCe 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é...
Partager