CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

(SDL C/C++) Récupérer la couleur

lord_kalipsy
lord_kalipsy
Niveau 10
21 septembre 2004 à 01:09:31

Salut,

Je me demandais si il existe une manière de récupéré la couleur d´un pixel précis sur une surface. Ceci servirais dans un contexte comme :

( pseudo code)

if ( ( pixel(x,y).couleur ) == vert )
. ...
else
. ...

Merci,
Psy

LGV
LGV
Niveau 28
21 septembre 2004 à 01:36:20

je ne connais pas SDL, mais si ça passe comme dans la plupart des API graphiques, regardes si tu peux pas locker ta ressource ( texture, target, backbuffer, etc.) pour obtenir un pointeur vers les données des pixels...

lord_kalipsy
lord_kalipsy
Niveau 10
21 septembre 2004 à 01:51:26

Merci pour ta réponse, j´suis désolé de t´avoir réveilé :-p

Ptival
Ptival
Niveau 10
21 septembre 2004 à 07:31:20

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
/ * p est l´adresse du pixel à tester */
Uint8 *p = ( Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

switch(bpp) {
case 1:
return *p;

case 2:
return *(Uint16 *)p;

case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] < < 16 | p[1] < < 8 | p[2];
else
return p[0] | p[1] < < 8 | p[2] < < 16;

case 4:
return *(Uint32 *)p;

default:
return 0; / * Ne devrait pas arriver mais évite les avertissements */
}
}

Voilà la fonction, après faut penser à locker la surface et unlocker la surface après, ou bien tu peux rajouter le lock/unlock directement dans la fonction getpixek() ; )

LGV
LGV
Niveau 28
21 septembre 2004 à 08:49:09

" ou bien tu peux rajouter le lock/unlock directement dans la fonction getpixek()"

SDL n´est-il pas une encapsulation, et ne se base-t-il pas, sous win, sur DX ou GL pour le tracé ? Si c´est le cas, ce serait à proscrire, sans quoi selon la gestion des ressources c´est le bus AGP qui risque de déclarer forfait ( quoique on en voit tres bien, meme sur des forums pros, qui s´étonnent de mettre leur machine à genoux avec des textures jpeg de 2048x2048 sans aucune précaution...)

Ptival
Ptival
Niveau 10
21 septembre 2004 à 08:55:42

LGV -> Ah désolé moi je connais pas trop :lol:

Mais si tu dis que saymal, j´veux bien te croire...D´ailleurs moi je lockais hors de la fonction donc je sais pas cque ça fait de locker dans la fonction, mais vu de mon niveau ça me paraissait pas un truc qui pourrait générer des problèmes.

Désolé :lol:

LGV
LGV
Niveau 28
21 septembre 2004 à 09:30:04

c´est sur le principe que c´est interessant de comprendre... Dans une archie moderne, les ressources ( graphiques ici) se baladent un peu partout : mémoire de la carte, mémoire du systeme, unité de calcul du GPU, voire duplication synchrone ou pas, etc. Donc à priori " on ne sait pas trop" où se trouve sa texture, entre autres ( meme si selon les APIs on peut décider de la gestion des ressources) ; le lock a justement pour effet de garantir que la ressources est bien accessible au systeme : ça veut dire que quand tu lockes une texture qu´est dans la VRAM de la carte, il faut la transferer jusque dans le RAM principale, où tu peux obtenir un pointeur valide ; et quand tu unlock, c´est l´inverse, les infos dans la carte sont mises à jour pour garder la cohérence. A chaque fois, c´est le bus AGP qui déguste : un lock par pixel, ça va plus faire slideshow qu´appli interactive... :)
Deja le lock " c´est mal", souvent on peu s´en passer, mais quand on en a vraiment besoin, faut bien penser aux implications en termes de performances. Bon quand je dis ça je pense surtout 3D, c´est sur qu´en 2D pour mettre à jour votre surface, vous avez pas d´autre choix que de locker :) Disons que locker une ressource plus d´une fois par frame, faut revoir son appli

JeanYvesYves
JeanYvesYves
Niveau 10
21 septembre 2004 à 11:14:33

exemple sur le site officiel :

http://sdldoc.csn.ul.ie/guidevideo.php#AEN112

par contre, oui, pense a locker la surface
le lock est une opération lente : lock une fois pour toutes, fait toutes tes modifs, puis délock :)

lord_kalipsy
lord_kalipsy
Niveau 10
21 septembre 2004 à 13:36:39

Merci de vos réponse. :)

dnob700
dnob700
Niveau 10
21 septembre 2004 à 19:41:50
  1. include < windows.h>

COLORREF GetPxlColor(int XPos,int YPos)
{
long HwndSrc,HsrcDC;
COLORREF Pxl;
HwndSrc = GetDesktopWindow();
HSrcDC = GetDC(HwndSrc);
Pxl=GetPixel(HSrcDC,XPos,nYPos);
ReleaseDC(HwndSrc, HSrcDC);

return Pxl;
}

Vive WIN32 ! !!!

LGV
LGV
Niveau 28
21 septembre 2004 à 20:08:32

ben ça change rien... A part si tu fais du win32 pur ( mais bon, je vois pas l´interet de se lancer dans un truc graphique dans ce là), des que tu fous SDL, DX ou openGL, le contexte va etre raccroché aux ressources de rendu, et du coup le GetDC il fait quoi . . il stalle tout le pipeline car la destination n´est plus dispo :/

dnob700
dnob700
Niveau 10
21 septembre 2004 à 20:18:19

oups, j´ai oublié qu´en C on ne déclare pas les pointeur comme des long, donc voici une version qui marche :

  1. ifndef _WINDOWS_
  2. include < windows.h>
  3. endif

COLORREF GetPxlColor(int XPos,int YPos)
{
HWND HwndSrc;
HDC HSrcDC;
COLORREF Pxl;
HwndSrc = GetDesktopWindow();
HSrcDC = GetDC(HwndSrc);
Pxl=GetPixel(HSrcDC,XPos,YPos);
ReleaseDC(HwndSrc, HSrcDC);
return Pxl;
}

Et COLORREF est homogène à un DWORD, donc un unsigned long je dirait.

dnob700
dnob700
Niveau 10
21 septembre 2004 à 20:19:46

LGV : je sais pas, je trouve que c´est finalement plus simple en win32 qu´en SDL.

Mais c´est pour les archives disont que je donne cette version, comme ça si un jour qqn trouve ce thread, mais ne veut pas utiliser SDL, il pourra utiliser win32.

LGV
LGV
Niveau 28
21 septembre 2004 à 20:34:07

il a interet a bien fouiller quand meme ; ) enfin, toute idée est bonne à prendre !

plus simple, pas forcément, plus masqué, oui... Si tu regardes ce qui se passe derriere les histoires de contexte, gerer correctement sont affichage pour faire des choses évoluées ( autre que reprogrammer ses MFC maison quoi...) c´est loin d´etre trivial :/

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment