OVH Cloud OVH Cloud

port offScreen et palette

3 réponses
Avatar
jean-jacques Chailloux
Bonjour, c'est la 1ère fois que j'utilise votre réseau, aussi j'espère
être à la bonne place.

voici mon problème: j'ai besoin de déterminer et de lire la valeur
exacte de la couleur d'un pixel dans une image;

je commence par charger une palette de la façon suivante:

unePalette = GetNewPalette(noPalette);
nbCouleurs = (*unePalette)->pmEntries;
for (i = 0; i <= nbCouleurs; i++)
lesCouleursRGB[i] = (*unePalette)->pmInfo[i].ciRGB;


ensuite, j'ouvre un port offScreen et j'attribue des couleurs aux pixels

erreur = NewGWorld(&offScreenGWorld, 0, &imageRect, NULL, NULL, 0);

...

SetCPixel(h, v, &lesCouleursRGB[k]);
GetCPixel(h, v, &laCouleurRGB);
if (laCouleurRGB.red != lesCouleursRGB[k].red)
{
Alert("pas pareil");
}

je teste la couleur attribuée et j'obtiens des alertes me disant que des
pixels ne sont pas de la couleur que je veux.
les couleurs sont très semblables mais ce ne sont pas exactement les mêmes.
je précise qu'il n'y a aucune ligne de code entre le SetCPixel(); et le
GetCPixel();

il semble qu'il y ait quelque chose que je ne comprenne pas dans
NewGWorld();

j'ai essayé
SetPalette((GrafPort *)offScreenGWorld, unePalette, false);
et
erreur = NewGWorld(&offScreenGWorld, 32, &imageRect, NULL, NULL, 0);
sans changement.

Quelqu'un aurait-il une idée pour obtenir une couleur exacte; j'ai
besoin de 16 bits par pixel (65536 tons de gris par exemple).

merci et à bientôt
JJC
Montréal

3 réponses

Avatar
Louis Balourdet

ensuite, j'ouvre un port offScreen et j'attribue des couleurs aux pixels

erreur = NewGWorld(&offScreenGWorld, 0, &imageRect, NULL, NULL, 0);

...

SetCPixel(h, v, &lesCouleursRGB[k]);
GetCPixel(h, v, &laCouleurRGB);
if (laCouleurRGB.red != lesCouleursRGB[k].red)
{
Alert("pas pareil");
}

je teste la couleur attribuée et j'obtiens des alertes me disant que des
pixels ne sont pas de la couleur que je veux.
les couleurs sont très semblables mais ce ne sont pas exactement les mêmes.
je précise qu'il n'y a aucune ligne de code entre le SetCPixel(); et le
GetCPixel();



A tout hasard: N'as tu pas oublié SetGWorld ?

GetGWorld(&oldPort, &oldDevice);
SetGWorld(offScreenGWorld, nil);

SetCPixel(h, v, &lesCouleursRGB[k]);
GetCPixel(h, v, &laCouleurRGB);
if (laCouleurRGB.red != lesCouleursRGB[k].red)
{
Alert("pas pareil");
}

SetGWorld(oldPort, oldDevice);

Mais ça ne doit pas être ça puisqu' apparament SetCPixel fonctionne.

Sinon , essaye le parametre noNewDevice:
NewGWorld(&offScreenGWorld, 0, &imageRect, NULL, NULL, noNewDevice);
il permet d'ajuster le gWorld sur les réglages écran.

Bonne chance.

Avatar
Louis Balourdet
j'ai essayé
SetPalette((GrafPort *)offScreenGWorld, unePalette, false);
et
erreur = NewGWorld(&offScreenGWorld, 32, &imageRect, NULL, NULL, 0);
sans changement.

Quelqu'un aurait-il une idée pour obtenir une couleur exacte; j'ai
besoin de 16 bits par pixel (65536 tons de gris par exemple).



Après plus ample investigation, je constate que le second parametre est
pixelDepth.

Il faut donc écrire
NewGWorld(&offScreenGWorld, 16, &imageRect, NULL, NULL, 0);

par ailleurs, on peut écrire
NewGWorld(&offScreenGWorld, 16, &imageRect, cTable, NULL, 0);

où cTable est une Table de couleurs de type cTabHandle.

L.B.

Avatar
jean-jacques Chailloux
Louis Balourdet a écrit:
j'ai essayé
SetPalette((GrafPort *)offScreenGWorld, unePalette, false);
et
erreur = NewGWorld(&offScreenGWorld, 32, &imageRect, NULL, NULL, 0);
sans changement.

Quelqu'un aurait-il une idée pour obtenir une couleur exacte; j'ai
besoin de 16 bits par pixel (65536 tons de gris par exemple).




Après plus ample investigation, je constate que le second parametre est
pixelDepth.

Il faut donc écrire
NewGWorld(&offScreenGWorld, 16, &imageRect, NULL, NULL, 0);


J'ai testé
erreur = NewGWorld(&offScreenGWorld, 32, &imageRect, NULL, NULL, 0);
et
erreur = NewGWorld(&offScreenGWorld, 0, &imageRect, NULL, NULL,
noNewDevice);

La situation semble s'améliorer en lisant la palette de la façon suivante:
lesCouleursRGB[i].red = (*unePalette)->pmInfo[i].ciRGB.red & 0xFF00;

je vais explorer plus avant cette avenue.
merci
JJC
Montréal