salut, j'ai une image RGB, je veux transformé tous ses pixels en ajoutant la valeur alpha. comment faire ? Merci bien
Version imprimable
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.
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 :question:) 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 deCode:
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:
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; }
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é ;)
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 :question: :D
:mrgreen:
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ù.
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
:calim2:Code:SetPixel(Image2->Canvas->Handle, i, j, TColor(RGBA(R, G, B, 255))
ça marche pas
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 :D... Pourrais tu être un peu plus précis sur ce qui "ne marche pas" :question:
Merci beaucoup à tous finalement j'ai trouvé que je n’avais pas besoin de ce alpha pour l'insérer dans l'image !