Page 2 sur 2

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 8:16
par djes
Pareil, pour moi ça fonctionne bien (PB 5.2b13 x86)... Seule différence entre les deux images sauvegardées : le PNG a le fond transparent et le bmp le fond noir.

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 9:47
par Eric
j'utilise Purebasic 5.20 LTS beta 15.

Ce qui n'est pas logique c'est que je compile avec l'option DirectX11 et l'image obtenue a les bonnes couleurs.
Mais si j'enlève cette option, l'image n'a plus les mêmes couleurs.
Donc, l'image obtenue avec une copie d'écran et chargée dans PAINT est correcte.

C'est très perturbant.

les images se trouvent sur Google Drive.

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:09
par Eric
Image


Image

Image

Image

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:09
par djes
Ptet une histoire de sens RGB/BGR, ou de lecture des DATAs?! Essaye avec ce code :

Code : Tout sélectionner

DataSection
   Image1:
   IncludeBinary "65801.IM1"
   Image2:
   IncludeBinary "65801.IM2"
   Image3: 
   
   Table_Couleurs:
   Data.i $000000,$0000aa,$00aa00,$00aaaa,$aa0000,$aa00aa,$aaaa00,$aaaaaa
   Data.i $000055,$0000ff,$00aa55,$00aaff,$aa0055,$aa00ff,$aaaa55,$aaaaff
   Data.i $005500,$0055aa,$00ff00,$00ffaa,$aa5500,$aa55aa,$aaff00,$aaffaa
   Data.i $005555,$0055ff,$00ff55,$00ffff,$aa5555,$aa55ff,$aaff55,$aaffff
   Data.i $550000,$5500aa,$55aa00,$55aaaa,$ff0000,$ff00aa,$ffaa00,$ffaaaa
   Data.i $550055,$5500ff,$55aa55,$55aaff,$ff0055,$ff00ff,$ffaa55,$ffaaff
   Data.i $555500,$5555aa,$55ff00,$55ffaa,$ff5500,$ff55aa,$ffff00,$ffffaa
   Data.i $555555,$5555ff,$55ff55,$55ffff,$ff5555,$ff55ff,$ffff55,$ffffff
   ; les index des 16 couleur par défaut
   Index_Couleurs:
   Data.b 0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63
EndDataSection
Dim Couleur.l(15)
Dim Palette.i(64) ; Valeurs RVB

Restore Table_Couleurs
For i=0 To 63
   Read.s Palette(i)
   
Next i

Restore Index_Couleurs
For i=0 To 15
   Read.b Index
   Couleur(i)=Palette(Index)
Next i

Enumeration
   #Image_synoptique
   #Sprite_synoptique
EndEnumeration

InitKeyboard()
;KeyboardMode(#PB_Keyboard_International)
InitSprite()
OpenScreen(640,480,32,"Synoptique Images")

UsePNGImageEncoder()
UseJPEGImageEncoder()
ClearScreen($aaaaaa)
x=0:y=0
CreateImage(#Image_synoptique,640,350,32)
CreateSprite(#Sprite_synoptique,640,350,#PB_Sprite_AlphaBlending)
Dim Plane_set.u(4)
StartDrawing(ImageOutput(#Image_synoptique))
*Image=?Image1 + 10 ; je ne sais pas à quoi servent les 10 premiers octets...?
Repeat
   ; lecture de huit pixels par plan
   pos = y*320+(x/8)
   For i=0 To 3
      Plane_set(i)=PeekA(*Image+80*i + pos)
   Next i
   ; recherche de la couleur de chaque pixel
   For i=0 To 7
      n1=(Plane_set(0)>>i) & %1
      n2=(Plane_set(1)>>i) & %1
      n3=(Plane_set(2)>>i) & %1
      n4=(Plane_set(3)>>i) & %1
      Index=(n1<<3 | n2<<2 | n3<<1 | n4)
      ;Index=(n4<<3 | n3<<2 | n2<<1 | n1)
      
      Plot(x+(7-i),y,Couleur(Index))
   Next i
   x+8
   If x>639
      x=0
      y+1
   EndIf
Until y>199
*Image=?Image2 + 10
x = 0
y = 0
Repeat
   ; lecture de huit pixels par plan
   pos = y*320+(x/8)
   For i=0 To 3
      Plane_set(i)=PeekA(*Image+80*i + pos)
   Next i
   ; recherche de la couleur de chaque pixel
   For i=0 To 7
      n1=(Plane_set(0)>>i) & %1
      n2=(Plane_set(1)>>i) & %1
      n3=(Plane_set(2)>>i) & %1
      n4=(Plane_set(3)>>i) & %1
      
      Index=(n1<<3 | n2<<2 | n3<<1 | n4)
      ;Index=(n4<<3 | n3<<2 | n2<<1 | n1)
      Plot(x+(7-i),y+200,Couleur(Index))
   Next i
   x+8
   If x>639
      x=0
      y+1
   EndIf
Until y>149

StopDrawing()
ClearScreen(0)
   StartDrawing(ScreenOutput())
   DrawingMode(#PB_2DDrawing_Default )
   DrawImage(ImageID(#Image_synoptique),0,0)
   StopDrawing()
FlipBuffers()
Repeat
   ExamineKeyboard()
   ClearScreen(0)
   StartDrawing(ScreenOutput())
   DrawingMode(#PB_2DDrawing_Default )
   DrawImage(ImageID(#Image_synoptique),0,0)
   StopDrawing()
   
   
   If KeyboardPushed(#PB_Key_S)
      GrabSprite(#Sprite_synoptique,0,0,640,350,#PB_Sprite_AlphaBlending)
      SaveSprite(#Sprite_synoptique,GetCurrentDirectory()+"Synoptique.png",#PB_ImagePlugin_PNG)
      SaveImage(#Image_synoptique,GetCurrentDirectory()+"Synoptique.bmp",#PB_ImagePlugin_BMP)
   EndIf
   FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
FreeImage(#Image_synoptique)
FreeSprite(#Sprite_synoptique)
End

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:17
par Eric
j'avais essayé. Mais cela ne change rien au fait que l'image affichée est correcte mais celle qui est sauvée en bmp.
l'affichage n'est plus correct quand j'élimine option du compilateur et donc je reviens en DirectX9.

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:28
par djes
Je sais qu'il y a souvent des bugs avec le BMP... Est-ce le cas ici ? (nous ne savons pas quelles sont les bonnes couleurs...)

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:35
par Eric
Si si si. je travaille sur ces équipements tous les jours.

Les bonnes couleurs sont avec l'option du compilateur "DirectX11".

Le circuit de chauffage et de froid en "rouge"
Le circuit de vapeur en "Jaune"
Le circuit d'évacuation en "vert"
Le circuit des gaz en "Bleu ciel"
Le circuit de piège à -70°C en "mauve"

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:50
par djes
Hum, donc comme dans la deuxième image que tu as envoyée. Moi j'ai le premier résultat, je pense donc qu'il faut inverser le RGB->BGR. A noter que je suis sous XP, donc pas de DX11. J'ai aussi l'impression que ton image est légèrement décalée, il faudrait peut-être remplacer les 10 octets par une autre valeur.

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 10:51
par G-Rom
si en changeant le subsystem ca deconne , c'est un bug de rgb() , j'avais le même problème fût un temps avec opengl/dx , win/linux.

Re: Quel est le codage mèmoire d'un ecran EGA ?

Publié : lun. 02/sept./2013 11:08
par djes
Oui, sur Mac aussi, c'est un grand classique ! Comme les images qui s'inversent sur Powerpoint :D Microsoft dans ses œuvres :D