Vous n'êtes pas identifié.
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 @+
Hors ligne
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 !
Hors ligne
g pas eu le tps de tester ms normalement ça marche.
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!
Hors ligne
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!
Hors ligne
a quoi sert les truc contraste ?
j'ai rien à l'ecran !!!
Hors ligne
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 !
Hors ligne
si j'ai quelque chose mais le darkpixel est hyper clair et le graypixel ne se voit meme pas !!!
quefaire ?
Hors ligne
Contrast sert à mieux voir les grayscale! Sinon tu vois presque rien!
Bon sinon je vais tester ça et je reposte la source corrigée
Hors ligne
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:
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]);} }
Hors ligne
ok mais je ne vois toujours pas grand chose sur mon ecran , tout est clair!
Hors ligne
Ben je t dit tu mets contrast(0); avt le drawOptn et contrast(1); avt de quitter
Et normalement c bon!
Hors ligne
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!!!
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 ???
Hors ligne