CPC Rulez
https://cpcrulez.fr/forum/

Conversion image ppm en CPC mode 0
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=6149
Page 1 sur 1

Auteur :  reno57 [ 28 Oct 2018, 15:37 ]
Sujet du message :  Conversion image ppm en CPC mode 0

Bonjour,

Je suis en train de developper un petit programme en langage LUA pour convertir une image .ppm en un fichier binaire identique a ce qui devrait être écrit dans la mémoire écran du cpc (en mode 0).

Pour chaque couple de pixel de l'image, j'arrive à générer en hexadécimal le numero de stylo à utiliser (ce que certain appelle aussi le numéro d'encre).
Le problème c'est que, un octet de la mémoire écran du CPC en mode 0, se crée en entremêlant les valeurs binaires des 2 numéros de stylo.

Je connais la manière dont sont combinés les deux valeurs de stylo pour constituer un octet de memoire (c'est bien décrit dans plusieurs articles sur CPCRulez).
Par contre, je ne vois pas comment coder le programme (en langage C ou LUA ou python mais pas ASM) qui, à partir des 2 valeurs de stylo va générer le chiffre binaire ou hexadecimal qui correspond à la valeur de l'octet à mettre dans la mémoire du CPC.

Auriez vous une suggestion à me faire ?

Auteur :  demoniakparadox [ 29 Oct 2018, 17:16 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

De mémoire il suffit de faire un truc du genre (en C)

mem_cpc[adresse] = pixel0 + ( pixel1 << 1 );

pixel0 et pixel1 étant les valeurs de couleur en mode 0 des pixels à allumer.

Auteur :  reno57 [ 29 Oct 2018, 19:11 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

Merci pour cette info, mais je ne vois pas en quoi un simple décalage de bit permettra de réaliser l'entrelacement de bits du mode 0 (sans mauvais jeux de mots).

Auteur :  marcel [ 29 Oct 2018, 22:02 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

Parce que c'est exactement ce qu'il faut faire (dans n'importe quel mode)

pour le mode 0 tu as 4 bits par pixel pour faire 16 couleurs et tu sais déjà que les bits sont entrelacés

donc tu te doutes qu'en les décalant dans un sens ou l'autre, tu passes du pixel de droite à celui de gauche et inversement :)

Auteur :  reno57 [ 29 Oct 2018, 23:29 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

Je pense que j'ai mal exprimé ma question. Je vais passer par un exemple.

Dans une image initiale (faite avec un logiciel actuel type PC MAC), j'ai, à un endroit, deux pixels qui se suivent horizontalement: un jaune (pixel de gauche) puis un rouge (pixel de droite).

Sur CPC la couleur jaune = 12 = 1100 (en binaire sur un demi octet) = La valeur A
Sur CPC la couleur rouge = 3 = 0011 (en binaire sur un demi octet) = La valeur B


Dans l'octet de la mémoire écran du CPC, pour voir un pixel jaune puis un rouge, il faudra écrire :
octet = 10100101 = La valeur C

Ma question est : Comment calculer la valeur C à partir des valeurs A et B ?

D'après ce que j'ai compris, selon vous, la valeur C = B + (A<<1) = 00000011 + 00011000 = 00011011
Ce qui est différent de C.

Est ce plus explicite ainsi ? Est ce que j'ai rien compris ?

Auteur :  demoniakparadox [ 30 Oct 2018, 07:36 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

Je pense qu'il te manque une étape alors : convertir la couleur CPC en octet de mémoire écran.
Exemple : un pixel de couleur 3 en mode 0, si il est placé à gauche, aura en mémoire la valeur 136 (#88 en Hexa), alors que si il est placé à droite, il aura la valeur 68 (#44 en Hexa).

Du coup le code devient :
Code :
mem_cpc[adresse] = ConvertPixelOctet(pixel0) + ( ConvertPixelOctet(pixel1) << 1 );

Auteur :  marcel [ 30 Oct 2018, 07:40 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

en mode 0 pour les pixels G3G2G1G0 / D3D2D1D0 l'octet est codé G0D0G2D2G1D1G3D3

codage similaire pour le mode 1 avec 4 pixels, les moins significatifs en premier

en C ça donne
Citer :
if (pix1&1) zepix+=128;if (pix1&2) zepix+=8;if (pix1&4) zepix+=32;if (pix1&8) zepix+=2;
if (pix2&1) zepix+=64;if (pix2&2) zepix+=4;if (pix2&4) zepix+=16;if (pix2&8) zepix+=1;


On en revient à ce qu'à écrit démoniak au départ, tu converti les deux pixels de la même façon et tu décales d'un bit :wink:

0 P0 0 P2 0 P1 0 P3 en mode 0
0 0 0 P0 0 0 0 P1 en mode 1
0 0 0 0 0 0 0 P0 en mode 2

Auteur :  reno57 [ 31 Oct 2018, 16:57 ]
Sujet du message :  Re: Conversion image ppm en CPC mode 0

:D Merci c'est exactement ça qui me manquait. Effectuer la comparaison bit à bit et générer l'octet résultant.

Sujet clos.

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/