Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 4328
Réponses : 28
Type : discussion
Etat : réponses autorisées

Stockage et numérisation d'image graphique [programme Coc5]

coc5 le 20/07/2007 à 13:15
Hier je m'ennuyais alors j'ai fais rapidement un petit programme sympa.

Je compte le développer évidemment, ce n'est que la version béta à l'état embryonnaire, mais je la mets quand même. Comme ça, vous pourrez donenez des suggestions ou me dire pourquoi ça ne marche pas (je sais ça ne reconstitue pas comme il faut mais c'est un tout petit rien que je ne vois pas )
Je pense par exemple rajouter un truc pour délimiter l'espace à sauvegarder.

Voici le programme à télécharger !

Code
If L.:Then
0->L.A(1)
0->L.B(1)
0->L.C(1)
0->L.D(1)
0->L.E(1)
0->L.F(1)
0->L.
End
Repeat getKey
For(I,1,5
Output(3,I," PROGRAMME
33!
Output(5,16-2I,"CREE PAR 
End
Output(7,7,"COC5
For(I,1,100
End
ClrHome
End
Goto 0
Lbl 3
Output(1,8," or
Output(1,6,"InF
Output(1,10,"s
Output(3,5," or
Output(3,1,"Ce pr
Output(3,7,"GraMMe permet de numériser une image puis de la recréer a l'écran.
Pause
For(I,3,7
Output(I,1,"               
End
Output(7,3," or

Output(3,1,"Numérisez en simple sauf en cas d'images ayant de n
Output(7,5,"Mbreuses alternances
Pause
ClrHome
Output(4,4, or
Output(4,1,"Me J
Output(4,6,"Indre :
Output(5,6," or
Output(5,6,"C
Output(5,8,"cL.Free.Fr
Pause
CLtHOMe
Lbl 0
Menu("IMAGEL.","DENUMERISER",1,"NUMERISER",2,"INFOS",3,"QUITTER",A
Lbl A:Stop
Lbl 1
Output(1,6," or
Output(1,3,"Dest
Output(1,8,"cKer
3->A
1->O
Lbl 6
not(O)->O
If not(O
Then
Output(3,8,"L
Output(4,8,"L`
Output(5,8,"Lf
Output(6,8,"L"
Output(7,8,"L...
Output(8,8,"L+
If O:Then
Output(3,8,"L.A
Output(3,8,"L.B
Output(3,8,"L.C
Output(3,8,"L.D
Output(3,8,"L.E
Output(3,8,"L.F
Output(3,8,"L.G
End
Repeat K=105
getKey->K
A->C
If K=25:A-1->A
If K=34:A+1->A
If A=2 or A=15:10not(A-15)+3->A
If A=9 and not(O) or A=8 and O
Goto 6
If AøC:Then
Output(C-6O,6,"
Output(C-6O,11,"
Output(A-6O,6,"*
Output(A-6O,11,"*
End
End
If A=3:L->L.NUM
If A=4:L`->L.NUM
If A=5:Lf->L.NUM
If A=6:L"->L.NUM
If A=7:L...->L.NUM
If A=8:L+->L.NUM
If A=9:L.A->L.NUM
If A=10:L.B->L.NUM
If A=11:L.C->L.NUM
If A=12:L.D->L.NUM
If A=13:L.E->L.NUM
If A=14:L.F->L.NUM
1->A:1->B:1->N
10->M
If L.NUM(1)=-1:Goto 5
Repeat A=94 and B=62
A+1->A
If A=95:Then
1->A
1+B->B
End
1+M->M
If M=13
Then
1->M
N+1->N
End
If int(10fPart(10^(M)L.NUM(N)=1:Pxl-On(B,A
End
CLrLIst L.NUM
Goto 0
Lbl 5
0->D
Repeat A=94 and B=62 and GetKeY
A+1->A
If A=95:Then
1->A
1+B->B
End
If M=14
Then
1->M
N+1->N
End
If L.NUM(N)>1 or D=1:Then
1->D
If L.NUM(N)=0:Then
1+N->N
2->M:0->D
End
L.NUM(N)-1->L.NUM(N)
If int(10fPart(L.NUM(N+1)))=1:Pxl-On(B,A
Else
If int(10fPart(10^(M)L.NUM(N)))=1:PXL-On(B,A
If int(10fPart(10^(M)L.NUM(N)))>1:N+1->N
M+1->M
End
End
ClrList L.NUM
Goto 0

Lbl 2
Menu("NUMERISER","IMG SIMPLE",S,"IMG CONTRASTE",C
Lbl C
0->L.DNU(1)
1->A:1->B:1->N:ClrHome
.1->M
Output(7,1,"APPUYEZ SUR UNE
Output(8,1,"POUR ARRETER
Repeat A=94 and B=62 or GetKeY
Output(5,1+int((94B-94+A)/389),"=
int((94B-94+A)/5.828)/10
Output(2,8,"   
Output(2,8,Ans
A+1->A
If A=95:Then
1->A
1+B->B
End
.1M->M
If M=10^(-14):Then
.1->M
N+1->N
0->L.DNU(N)
End
Mpxl-Test(B,A)+L.DNU(N)->L.DNU(N
End
Goto 9
Lbl S
ClrList L.NUM
-1->L.NUM(1)
1->A:1->B:0->U
2->N:0->M
pxl-Test(1,1)->L
Output(7,1,"APPUYEZ SUR UNE
Output(8,1,"POUR ARRETER
Repeat A=94 and B=62 or getkey
Output(2,8,"   
Output(2,8,.1int((94B-94+A)/5.828)
A+1->A
If A=95:Then
B+1->B
1->A
End
L->J
pxl-Test(B,A)->L
U+1->U
If LøJ:Then
If U=1:M+1->M
If M=14 or Uø1:Then
N+1->N
0->L.NUM(N)
M->G
1->M
End
If U=L:10^(-M)+L.NUM(N)->L.NUM(N)
If Uø1:Then
210^(-G)+L.NUM(N-1)->L.NUM(N-1)
U->L.NUM(N)
N+1->N
J->L.NUM(N)
End
0->U
End
End
Lbl 9
ClrHome
Output(1,4," or
Output(1,3,"St
Output(1,6,"cKer dans
3->A
1->O
Lbl 7
not(O)->O
If not(O
Then
Output(3,8,"L1
Output(4,8,"L2
Output(5,8,"L3
Output(6,8,"L4
Output(7,8,"L5
Output(8,8,"L6
If O:Then
Output(3,8,"L.A
Output(3,8,"L.B
Output(3,8,"L.C
Output(3,8,"L.D
Output(3,8,"L.E
Output(3,8,"L.F
Output(3,8,"L.G
End
Repeat K=105
getKey->K
A->C
If K=25:A-1->A
If K=34:A+1->A
If A=2 or A=14:10not(A-2)+3->A
If A=9 and not(O) or A=8 and O
Goto 7
If AøC:Then
Output(C-6O,6,"
Output(C-6O,11,"
Output(A-6O,6,"*
Output(A-6O,11,"*
End
End
If A=3:L.DNU->L
If A=4:L.DNU->L`
If A=5:L.DNU->Lf
If A=6:L.DNU->L"
If A=7:L.DNU->L...
If A=8:L.DNU->L+
If A=9:L.DNU->L.A
If A=10:L.DNU->L.B
If A=11:L.DNU->L.C
If A=12:L.DNU->L.D
If A=13:L.DNU->L.E
If A=14:L.DNU->L.F
ClrList L.DNU
Goto 0


^
^
|
Edit
vibra le 20/07/2007 à 21:11
J'ai cru comprendre que le principe correspondait à mon programme scannaire, mais en mieux. Par contre, est-ce que tu pourrais expliquer comment ca fonctionne (dans les grandes lignes), et comment on l'utilise ?
coc5 le 21/07/2007 à 12:18
Pour commencer, tu t'arrange pour avoir quelque chose sur l'écran graphique ( à moins que tu ne souhaites enregistrer un écran blanc^^ ). Tu dessines un truc quoi.

Tu lance le programme, puis tu choisis numériser. Dès lors, ce programme va pour chaque pixel identifier s'il est "allumé" ou non (Pxl-test). S'il est éteint il enregistre un 0 sinon un 1.

Jusqu'ici c'était facil. Vient ensuite le problème de stockage. J'ai utilisé la technique de stockage de Ratuss couplé avec un amélioration de liste. Ce qui revient quand même, pour une image format maximum, à 4ko.

Les nombres se stockent dans une liste provisoire appellé L.NUM, qui se transfera dans la liste choisi/souhaitée. Pour dénumériser, c'est la même chose, dans l'autre sens, si 1 faire Point on.

J'ai d'ailleurs une idée pour réduire le stockage à environ 3000 octets, mais ce sera plus compliqué. Pour l'instant, j'ai juste un problème que je n'arrive pas à résoudre.
Sangohan38 le 21/07/2007 à 14:44
Explique ton problème, on pourra srement t'aider.

Sangohan38
vibra le 21/07/2007 à 15:20
Oui, donc c'est bien un programme comme je l'avais fais, mais apparemment le tien est beaucoup mieux. Bravo. veryhappy.gif
par contre, serait-il possible de remplacer les
Code
&#8735
par les commandes réelles stp ?
coc5 le 21/07/2007 à 15:55
Voilà.

Le L. correspond au petit L que l'on trouve dans le catalogue, pour les listes.

Sinon je pense bientôt changer le système de stockage de cette manière :

Pour toute suite de 0 ou de 1 supérieur à 3, je met le nombre déduis suivis du chiffre correspondant.

Par exemple:

00000110000011111111001
Deviendra
50115081001
Sangohan38 le 21/07/2007 à 18:06
Simple à faire pour les 0 où pour les 1.
Mais les deux entreront en conflits: commen savoir si c'est un 1 ou un 0.
A mon avis donc, mieux vaut avoir un seul numéros compressé (et je pense qu'il vaut mieux le 0).
Au passage, cette méthode est le principe des faxs actuels.

Sangohan38
webmaster le 21/07/2007 à 18:25
Voilà l'algo :

Si chiffre_courant = 0 ou 1 => le réécrire
si chiffre_courant >1
=> on le stock dans n
=> chiffre_courant=chiffre_courant+1
=> on lit le chiffre_courant
=> Pour x allant de 1 à n
=>=> réécrire chiffre_courant
chiffre_courant=chiffre_courant+1
revenir en haut et poursuivre jusqu'à la fin des données

Donc, tu vois Sango, ca marche très bien !

@+ Le Webmaster beer.gif
Sangohan38 le 21/07/2007 à 20:48
En effet, ça marche.

Sangohan38
vibra le 22/07/2007 à 10:25
Désolé de vous ennuyer avec mes questions à la noix, mais qu'est ce que L.DNU et L.NUM (je suis sur 82) ?
Sangohan38 le 22/07/2007 à 11:18
Ce sont des listes qui ont été crées pour le prog, mais pour ta calcu, c'est impossible de les avoir car tu n'a que 6 listes.

Sangohan38
vibra le 22/07/2007 à 11:28
Vive la 82 cry.gif
coc5 le 22/07/2007 à 12:37
Zut je savais pasque les Ti82 n'en avais pas la possiblité... Bas sinon tu peux toujours remplacer par des listes déjà existantes, tu auras juste moins de possibilités de stockage, c'est tout...


Sinon le modèle de numérisation que j'aais proposé ne marche pas en faîte car le programme ne pourra pas distinguer un "91-0 d'un "9-1 0". Donc j'ai presque terminé une autre manière, je la mettrais tout à l'heure.
coc5 le 22/07/2007 à 15:06
Voilà, finis bigmouth.gif

Bon il reste des bugs mais en gros c'est bon.

Le lien viendra bientôt (c'est pas le bon là)
webmaster le 22/07/2007 à 15:14
coc5 a écrit :
Sinon le modèle de numérisation que j'aais proposé ne marche pas en faîte car le programme ne pourra pas distinguer un "91-0 d'un "9-1 0". Donc j'ai presque terminé une autre manière, je la mettrais tout à l'heure.


Très juste. Il suffit soit de se limiter à 9 soit de faire une matrice (ou 2 listes)

@+ Le Webmaster beer.gif
coc5 le 22/07/2007 à 15:44
Bouarf Badonguo marche pas karate.gif

-Sinon comme ça l'image peut prendre jusqu'à deux fois moins de place (et même moins de 20 octets si vous voulez un bel écran blanc numérisé^^)-
coc5 le 22/07/2007 à 17:47
Ca y est Badongo remarche j'ai changé le lien happy.gif

Sinon il reste des bugs à régler, mais l'essentiel est là (par exemple les getkeys sont mal rentrées).
Sangohan38 le 22/07/2007 à 19:35
Badongo me sort "file not found".
Essaye avec un autre uploadeur.

Sangohan38
vibra le 22/07/2007 à 19:49
ouais moi aussi j'en ai fais une vertion pour la 82, mais un écrant complet prend 1500 octets !!
coc5 le 22/07/2007 à 20:16
Je pense terminer vraiment demain.
vibra le 24/07/2007 à 16:34
Ouais moi aussi, sauf que je suis passé en dessous des 900 octets l'image !!! Si tu fais mieux que moi... D'ailleurs tiens, je lance un petit concours : c'est a celui qui stoke une image en le moins de place qui gagne. Je suis sur d'être au moins dans le top 3 !!!
coc5 le 24/07/2007 à 17:47
En fait en ce moment j'ai plus le temps (en plus je vais partir 15 jours le 28 ). Mais je vois mal comment tu peux enregistrer une image complexe (genre tout occupé) en 900 octets. Selon la complexité, la place occupée varie entre 10 (image blanche) et 2500 (image complexe).
vibra le 25/07/2007 à 14:04
Et pourtant... Une image totalement occupée par des motifs aléatoires complexes prend au maximum 1300 octets !! T'as qu'a essayer mon code https://tout82.pages-perso.fre[...]t.php?sujet=895
coc5 le 25/07/2007 à 18:22
Bon je recommence tout vu que tu as fais mieux crazy.gif
J'ai bien une idée. Enfin un début.

Si seulement je pouvais rentrer des lettres dans les variables... (des lettres et des chiffres).

Je crois que je vais essayer en ASM, vu que l'hexadécimal est possible happy.gif
vibra le 26/07/2007 à 13:49
Si tu rentre dans l'ASM, moi je jette l'éponge. Par contre à quoi ça sert d'utiliser le système hexadécimale ??
coc5 le 26/07/2007 à 18:57
Ca permet d'avoir 1,2,3 -etc- 9,10,1A,1B,1C,1D,1F
Je pourrais ainsi mettre un chiffre "signal" pour séparer les nombres.

Sinon pour l'ASM rassure toi je n'en connais pas assez. En fait il me manque un endroit sur de stockage (la pile (on peut) n'est pas un endroit sûr je pense). Et aussi l'équivalent de Pxl-test. Donc pas tout de suite^^
vibra le 26/07/2007 à 22:55
Je ne suis pas sur qu'un signal pour séparer les nomres soit une bonne idée, car tu vas perdre beaucoup de place, mais l'idée est intéressante elle peut avoir des applications dans plein d'autres programmes !
ratuss le 27/07/2007 à 11:34
asm guru a écrit :
_ipoint (4AE8h): Plots point on screen.

Input.
B, C are the x-y coordinates in pixels.
D is set either to 0 - light, 1 - dark, 2 - reverse, 3 - test pixel, 4 - copy from display buffer.

Output.
If D=3, Z is outputted as either 0 or 1 depending on whether the pixel is set or not.

All tutorials Copyright (c) James Matthews 1998, unless specified.


+
vibra le 27/07/2007 à 11:55
Pff tricheur... laugh.gif