Forum Graph100

Forum Graph100

Vous n'êtes pas identifié.

Annonce

Bonjour et bienvenue sur le nouveau Forum Graph100 !
L'intégralité des données a été transférée sur un forum PunBB et tout les comptes sont fonctionnels avec le même nom d'utilisateur et mot de passe.
Un wiki est aussi disponible avec le même compte ! N'oubliez pas de remettre votre avatar, bon surf !
Pour plus d'informations, consultez ce post.

#1 01 Jul 2002 03:40:41

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Besoin d'aide en niveau de gris !!!

j'essaye de faire afficher un sprite en niveaux de gris: voila le code que j'utilise . mais sur la graph100 ca ressemble à rien:


#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include <bios.h>
#define segm_video 0x1A20

void setgray(void) //Mise en marche du mode niveau de gris
{
outportb(0x02,0xCB);
}

void gray_pixel(char X,int Y)   //niveau de gris: pixel clair
{
asm {
xor cl,cl
mov ch,X
mov bx,Y
shr cx,3  //divise X par 8 reste dans cl
shr cl,5        //met le reste de la division au bon format
mov dl,ch //dl = quotient
xor dh,dh       //dx = dl
shl dx,1 //|
add dl,ch //| multiplie dx par 192
shl dx,6 //|
mov si,dx
add si,bx       //si=dx+bx (colonne/16*192 + ligne)
xor bl,bl
db 0x0F,0x14,0x0C3 //set1 bl,cl (specifique au nec v20/30)
or es:[si],bl           //met le pixel
}
}

void dark_pixel(char X,int Y) //niveau de gris: pixel foncé
{
asm {
xor cl,cl
mov ch,X
mov bx,Y
shr cx,3  //divise X par 8 reste dans cl
shr cl,5        //met le reste de la division au bon format
mov dl,ch //dl = quotient
xor dh,dh       //dx = dl
shl dx,1 //|
add dl,ch //| multiplie dx par 192
shl dx,6 //|
mov si,dx
add si,bx       //si=dx+bx (colonne/16*192 + ligne)
xor bl,bl
db 0x0F,0x14,0x0C3 //set1 bl,cl (specifique au nec v20/30)
or es:[si],bl           //met le premier pixel
add si,128
or es:[si],bl           //met le second
}
}

void white_pixel(char X,int Y) //niveau de gris: pixel blanc
{
asm {
xor cl,cl
mov ch,X
mov bx,Y
shr cx,3  //divise X par 8 reste dans cl
shr cl,5        //met le reste de la division au bon format
mov dl,ch //dl = quotient
xor dh,dh       //dx = dl
shl dx,1 //|
add dl,ch //| multiplie dx par 192
shl dx,6 //|
mov si,dx
add si,bx       //si=dx+bx (colonne/16*192 + ligne)
mov bx,0xFF
db 0x0F,0x12,0x0C3 //clr1 bl,cl (specifique au nec v20/30)
and es:[si],bl
add si,128
and es:[si],bl          //met le second
}
}


char optn[1][9][7] =
{
2,2,2,2,1,1,2,
2,2,2,1,1,1,2,
2,2,1,1,1,2,2,
2,1,1,1,2,2,2,
2,2,1,1,1,2,2,
2,2,2,1,1,1,2,
2,2,1,1,1,2,2,
2,1,1,1,2,2,2,
2,1,1,2,2,2,2,
};

void drawoptn(unsigned char x, unsigned char y, unsigned char nb)
{int C,D;
for(C=0;C<7;C++){
for(D=0;D<9;D++){
if(optn[nb][D][C]==1) dark_pixel(x + C,y + D);
if(optn[nb][D][C]==2) gray_pixel(x + C,y + D);}}}

void effoptn(unsigned char x, unsigned char y, unsigned char nb)
{int C,D;
for(C=0;C<7;C++){
for(D=0;D<9;D++){
if(optn[nb][D][C]==1 || optn[nb][D][C]==2) white_pixel(x + C,y + D);}
}}


void clear(void) //Efface l'ecran
{
int i;
for (i=0;i<=3072;i+=2)
{
_SI=i;
_AX=0;
asm mov es:[si],ax;
}
}


int main()
{int a,b;
a=50;b=30;
setgray();
clear();
drawoptn(a,b,0);
getch();
return(0);
}



Au fait pourriez vs me dire commet vs faites pour afficher toute un image en niveaux de gris ?

    Merci @+


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#2 01 Jul 2002 04:27:51

L@rk
Programmeur Graph100
Lieu: Saumur (49)
Date d'inscription: 30 Jan 2002
Messages: 742
Site web

Re: Besoin d'aide en niveau de gris !!!

Bon g pas épluché ton code pske g pas le temps.

Mais g qq remarques à faire:
* Je vois que tu affiche point par point. C beaucoup trop lent. Pour optimiser ta routine (qd elle fonctionnera) tu devras écrire byte par byte voire mot par mot si c possible.

* Pour afficher une image en niveaux de gris, la méthode la + simple est d'avoir deux images, chacune représentant une "couche" de la mémoire vidéo (2 couches sont suffisantes puisque la 3eme n'apporte que tres peu de variations de couleur). Ensuite, tu copie chacune de ces couches à leut emplacement respectif dans la mem video (et tu les affiche octet par octet stp !!!!)

Voila !


L@rk @ FGPstudios

Hors ligne

 

#3 01 Jul 2002 04:52:50

C@siomax
Programmeur Graph100
Lieu: Grenoble, au QG de fmw-product
Date d'inscription: 03 Feb 2002
Messages: 3042
Site web

Re: Besoin d'aide en niveau de gris !!!

g pas eu le tps de tester ms normalement ça marche.

Code:

short SEGMENT=0x1A20;
void setvideo(void) //passe en mode graphique
{
    SEGMENT=peek(0x4E,0);
    _ES=SEGMENT;
}



void setgray(void)    //Mise en marche du mode niveau de gris
    {
    outportb(0x02,0xCB);
    }

void delgray(void)    //quitte le mode niveau de gris
    {
    outportb(0x02,0xE3);
    }

void gray_pixel(char X,int Y)      //niveau de gris: pixel clair
{
asm {
    xor cl,cl
    mov ch,X
    mov bx,Y
    shr cx,3     //divise X par 8 reste dans cl
    shr cl,5        //met le reste de la division au bon format
    mov dl,ch    //dl = quotient
    xor dh,dh       //dx = dl
    shl dx,1    //|
    add dl,ch    //| multiplie dx par 192
    shl dx,6    //|
    mov si,dx
    add si,bx       //si=dx+bx (colonne/16*192 + ligne)
    xor bl,bl
    db 0x0F,0x14,0x0C3    //set1 bl,cl (specifique au nec v20/30)
    or es:[si],bl           //met le pixel
    }
}

void dark_pixel(char X,int Y)    //niveau de gris: pixel foncé
{
    asm {
    xor cl,cl
    mov ch,X
    mov bx,Y
    shr cx,3     //divise X par 8 reste dans cl
    shr cl,5        //met le reste de la division au bon format
    mov dl,ch    //dl = quotient
    xor dh,dh       //dx = dl
    shl dx,1    //|
    add dl,ch    //| multiplie dx par 192
    shl dx,6    //|
    mov si,dx
    add si,bx       //si=dx+bx (colonne/16*192 + ligne)
    xor bl,bl
    db 0x0F,0x14,0x0C3    //set1 bl,cl (specifique au nec v20/30)
    or es:[si],bl           //met le premier pixel
    add si,128
    or es:[si],bl           //met le second
    }
}

void white_pixel(char X,int Y)    //niveau de gris: pixel blanc
{
    asm {
    xor cl,cl
    mov ch,X
    mov bx,Y
    shr cx,3     //divise X par 8 reste dans cl
    shr cl,5        //met le reste de la division au bon format
    mov dl,ch    //dl = quotient
    xor dh,dh       //dx = dl
    shl dx,1    //|
    add dl,ch    //| multiplie dx par 192
    shl dx,6    //|
    mov si,dx
    add si,bx       //si=dx+bx (colonne/16*192 + ligne)
    mov bx,0xFF
    db 0x0F,0x12,0x0C3    //clr1 bl,cl (specifique au nec v20/30)
    and es:[si],bl
    add si,128
    and es:[si],bl          //met le second
    }
}

void gpixel(char X, int Y, char couleur)
{
asm {
    xor cl,cl
    mov ch,X
    mov bx,Y
    shr cx,3     //divise X par 8 reste dans cl
    shr cl,5        //met le reste de la division au bon format
    mov dl,ch    //dl = quotient
    xor dh,dh       //dx = dl
    shl dx,1    //|
    add dl,ch    //| multiplie dx par 192
    shl dx,6    //|
    mov si,dx
    add si,bx       //si=dx+bx (colonne/16*192 + ligne)
    cmp couleur,2
    je Gpixel_Dark
    cmp couleur,1
    je Gpixel_Gray
    mov bx,0xFF
    db 0x0F,0x12,0x0C3    //clr1 bl,cl (specifique au nec v20/30)
    and es:[si],bl
    add si,128
    and es:[si],bl          //met le second
    }
    return;
Gpixel_Gray :
    asm{
    xor bl,bl
    db 0x0F,0x14,0x0C3    //set1 bl,cl (specifique au nec v20/30)
    or es:[si],bl           //met le pixel
    }
    return;
Gpixel_Dark :
    asm{
    xor bl,bl
    db 0x0F,0x14,0x0C3    //set1 bl,cl (specifique au nec v20/30)
    or es:[si],bl           //met le premier pixel
    add si,128
    or es:[si],bl           //met le second
    }
}




void incontraste(void)
{
  asm mov ah,22h;
  asm mov bl,0;
  asm int 7Ch;
}
void decontraste(void)
{
  asm mov ah,22h;
  asm mov bl,1;
  asm int 7Ch;
}

void contrast(unsigned char pl) //1 -> aug 0 -> dim
{
  unsigned char cnt = 6;
  for (unsigned char id = 1 ; id <= cnt ; id++)
  {
    if (pl == 0) decontraste();
    if (pl == 1) incontraste();
  }
}

void clear(void) //Efface l'ecran
{
int i;
for (i=0;i<=3072;i+=2)
    {
    _SI=i;
    _AX=0;
    asm mov es:[si],ax;
    }
}

unsigned char optn[][9][7] = {
{2,2,2,2,1,1,2} 
{2,2,2,1,1,1,2} 
{2,2,1,1,1,2,2}
{2,1,1,1,2,2,2} 
{2,2,1,1,1,2,2} 
{2,2,2,1,1,1,2} 
{2,2,1,1,1,2,2} 
{2,1,1,1,2,2,2} 
{2,1,1,2,2,2,2}}; 

void drawOptn(int x, int y, int nb)
{
int c, d;
for(c=0;c<9;c++)
       for(d=0;d<7;d++)
             {gpixel(x,y,optn[nb][c][d]);}
}

main () {
clrscr();
setvideo();
setgray();
clear();
contrast(0);
drawOptn(50,30,0);
getch();
clear();
contrast(1);
delgray();
}

Voilou!


:mrd: :mrd:
.·´¯`·.¸.-> Casiomax <-·´¯`·.¸.·

Statut: indéfini

Hors ligne

 

#4 01 Jul 2002 04:57:36

C@siomax
Programmeur Graph100
Lieu: Grenoble, au QG de fmw-product
Date d'inscription: 03 Feb 2002
Messages: 3042
Site web

Re: Besoin d'aide en niveau de gris !!!

G oublié le header en ht ms normalement c bon. (n'oublie pas d'enregistrer ta source en *.cpp et pas *.c sinon je crois pas que ça marche.  t'inquiète ça change rien, au contraire en C++ c plus simple! T'as pas besoin de déclarer ttes tes variables avt! Tu les déclares pdt ta ft et pas après le main ou avt les instructions. Enfin bref c plus simple!  wink


:mrd: :mrd:
.·´¯`·.¸.-> Casiomax <-·´¯`·.¸.·

Statut: indéfini

Hors ligne

 

#5 01 Jul 2002 05:51:49

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Besoin d'aide en niveau de gris !!!

a quoi sert les truc contraste ?
j'ai rien à l'ecran !!!


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#6 01 Jul 2002 05:55:31

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Besoin d'aide en niveau de gris !!!

je l'ai enregistrer en .C
j'ai supprimé

void contrast(unsigned char pl) //1 -> aug 0 -> dim
{
  unsigned char cnt = 6;
  for (unsigned char id = 1 ; id <= cnt ; id++)
  {
    if (pl == 0) decontraste();
    if (pl == 1) incontraste();
  }
}

et j'ai mis a la place deconstrate() et inconstrate(). je pense que ca ne change rien. mais j'ai toujours rien à l'ecran !


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#7 01 Jul 2002 05:57:27

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Besoin d'aide en niveau de gris !!!

si j'ai quelque chose mais le darkpixel est hyper clair et le graypixel ne se voit meme pas !!!
quefaire ?


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#8 01 Jul 2002 06:02:53

C@siomax
Programmeur Graph100
Lieu: Grenoble, au QG de fmw-product
Date d'inscription: 03 Feb 2002
Messages: 3042
Site web

Re: Besoin d'aide en niveau de gris !!!

Contrast sert à mieux voir les grayscale! Sinon tu vois presque rien!
Bon sinon je vais tester ça et je reposte la source corrigée


:mrd: :mrd:
.·´¯`·.¸.-> Casiomax <-·´¯`·.¸.·

Statut: indéfini

Hors ligne

 

#9 01 Jul 2002 06:08:03

C@siomax
Programmeur Graph100
Lieu: Grenoble, au QG de fmw-product
Date d'inscription: 03 Feb 2002
Messages: 3042
Site web

Re: Besoin d'aide en niveau de gris !!!

Ah oui, j'oubliais:
en plus du contraste à régler correctement, ton image sera très certainement inversée!

Donc modifie la routine d'affichage de cette façon:

Code:

void drawOptn(int x, int y, int nb) 
{ 
int c, d; 
for(c=0;c<9;c++) 
       for(d=0;d<7;d++) 
             {gpixel(x,y,optn[nb][8-c][6-d]);} 
} 

:mrd: :mrd:
.·´¯`·.¸.-> Casiomax <-·´¯`·.¸.·

Statut: indéfini

Hors ligne

 

#10 01 Jul 2002 06:11:41

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Besoin d'aide en niveau de gris !!!

ok mais je ne vois toujours pas grand chose sur mon ecran , tout est clair!


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#11 01 Jul 2002 07:02:06

C@siomax
Programmeur Graph100
Lieu: Grenoble, au QG de fmw-product
Date d'inscription: 03 Feb 2002
Messages: 3042
Site web

Re: Besoin d'aide en niveau de gris !!!

Ben je t dit tu mets contrast(0); avt le drawOptn et contrast(1); avt de quitter

Et normalement c bon!


:mrd: :mrd:
.·´¯`·.¸.-> Casiomax <-·´¯`·.¸.·

Statut: indéfini

Hors ligne

 

#12 01 Jul 2002 07:46:08

casioworld
Programmeur Graph100
Lieu: Palaiseau (Essonne)
Date d'inscription: 08 Feb 2002
Messages: 1843
Site web

Re: Besoin d'aide en niveau de gris !!!

void contrast(unsigned char pl) //1 -> aug 0 -> dim
{
  unsigned char cnt = 6;
  for (unsigned char id = 1 ; id <= cnt ; id++)
  {
    if (pl == 0) decontraste();
    if (pl == 1) incontraste();
  }
}
donc contrast(1) augmente le contraste et constrat(0) le diminue.
Or tu me disais de mettre constrast(0) avant donc de diminuer le contrast. C'est pour ca que je ne voyais rien. J'ai mis contrast(1) avant drawOption et contrast(0) après. Et ca marche!!! lol
J'ai vraiment un pixel noir et gris et blanc.
Je te remercie infiniment !!!!!!!!!!!!!!!!!!!!!!
Mais il me reste un prob. Comment afficher toute une image !!!
En monochrome on utilise bmp2c et une fonction (issue de ton tuto sur ton site) drawPict(image).
Mais avec une image en gris je fais comment ? KTR a fait un prog, c'est celui qu'il faut? Y parait qu'il ya des bug, c'est vrai ???


- http://www.casioworld.wb.st  --> plus grande base de données pour Graph100+
- http://efreidelirium.free.fr --> vive l'EFREI mdr

Hors ligne

 

#13 01 Jul 2002 11:32:17

C@siomax
Programmeur Graph100
Lieu: Grenoble, au QG de fmw-product
Date d'inscription: 03 Feb 2002
Messages: 3042
Site web

Re: Besoin d'aide en niveau de gris !!!

Y'a pa de koi! big_smile


:mrd: :mrd:
.·´¯`·.¸.-> Casiomax <-·´¯`·.¸.·

Statut: indéfini

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr