Page 1 sur 2

Probleme traitement d'image

Publié : dim. 31/mai/2009 16:11
par lepiaf31
Bonjour

Je fesais quelques manipulations sur les images quand un petit probleme est survenu. En gros je prends une image, et pour chaque pixel, j'augmente sa composante rouge de 20. Puis je prend la nouvelle image et j'enleve 20 à le constante rouge de chaque pixel. Donc normalement je devrais retomber sur l'image de départ et paf ! ca marche pas ! Voila le resultat:

image de départ:
Image

ajout de rouge:
Image

retour à l'image de depart:
Image

vous voyez, sur la dernière image il y a quelques pixels qui sont completement rouge.
Voici le code que j'ai utilisé:

Code : Tout sélectionner

Procedure CryptImage(File.s)
  If LoadImage(0, File)
    If CreateImage(1, ImageWidth(0), ImageHeight(0), ImageDepth(0))
      For x=0 To ImageWidth(0)-1
        For y=0 To ImageHeight(0)-1
          StartDrawing(ImageOutput(0))
          Color = Point(x,y)
          StopDrawing()
          Red = Red(Color)
          Red = Red+20
          If Red > 255
            Red = Red - 255
          EndIf
          StartDrawing(ImageOutput(1))
          Plot(x,y,RGB(Red, Green(Color), Blue(Color)))
          StopDrawing()
        Next
      Next
      SaveImage(1, "test1.bmp")
    EndIf
  EndIf
EndProcedure

Procedure UncryptImage(File.s)
  If LoadImage(0, File)
    If CreateImage(1, ImageWidth(0), ImageHeight(0), ImageDepth(0))
      For x=0 To ImageWidth(0)-1
        For y=0 To ImageHeight(0)-1
          StartDrawing(ImageOutput(0))
          Color = Point(x,y)
          StopDrawing()
          Red = Red(Color)
          Red = Red-20
          If Red < 255
            Red = Red+255
          EndIf
          StartDrawing(ImageOutput(1))
          Plot(x,y,RGB(Red, Green(Color), Blue(Color)))
          StopDrawing()
        Next
      Next
      SaveImage(1, "test2.bmp")
    EndIf
  EndIf
EndProcedure
          
          
CryptImage("image.bmp")
UncryptImage("test1.bmp")
Donc si quelqu'un sait pourquoi ces petits pixels rouges sont là, ca serait sympa d'éclairer ma lanterne :)

Publié : dim. 31/mai/2009 16:18
par tonton
If Red < 255
Red = Red+255

bizard ca!!! :wink:

sinon, on ne revient pas a l' original quant il y a saturation de la couleur.

Publié : dim. 31/mai/2009 16:20
par lepiaf31
Ha quel c*n il fallait que je mette
If Red < 0
^^

Merci =)

Publié : dim. 31/mai/2009 17:26
par lepiaf31
Bon j'ai de nouveau un probleme du meme genre. Cette fois-ci, j'ai simplement modifié les 3 constantes de couleur (rouge, vert et bleu) et voila ce que j'obtien:

Image
Image
Image

Sur la 3e image (décryptée) j'ai quelques pixels qui ne sont pas de la bonne couleur et je ne sais pas pourquoi. Voila le code:

Code : Tout sélectionner

Procedure CryptImage(Image)
  Image2 = 0
  RedAdd = 25
  GreenAdd = 128
  BlueAdd = 212
  
  If IsImage(Image)
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image))
    If Image2
      For x=0 To ImageWidth(Image)-1
        For y=0 To ImageHeight(Image)-1
          StartDrawing(ImageOutput(Image))
          Color = Point(x,y)
          StopDrawing()
          StartDrawing(ImageOutput(Image2))
          Red = Red(Color)+RedAdd
          Green = Green(Color)+GreenAdd
          Blue = Blue(Color)+BlueAdd
          
          While Red > 255
            Red - 255
          Wend
          While Green > 255
            Green - 255
          Wend
          While Blue > 255
            Blue - 255
          Wend
          Plot(x,y,RGB(Red,Green,Blue))
          StopDrawing()
        Next
      Next
    EndIf
  EndIf
  ProcedureReturn Image2
EndProcedure

Procedure DecryptImage(Image)
  Image2 = 0
  RedAdd = 25
  GreenAdd = 128
  BlueAdd = 212
  
  If IsImage(Image)
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image))
    If Image2
      For x=0 To ImageWidth(Image)-1
        For y=0 To ImageHeight(Image)-1
          StartDrawing(ImageOutput(Image))
          Color = Point(x,y)
          StopDrawing()
          StartDrawing(ImageOutput(Image2))
          Red = Red(Color) - RedAdd
          Green = Green(Color) - GreenAdd
          Blue = Blue(Color) - BlueAdd
          
          While Red < 0
            Red + 255
          Wend
          While Green < 0
            Green + 255
          Wend
          While Blue < 0
            Blue + 255
          Wend
          Plot(x,y,RGB(Red,Green,Blue))
          StopDrawing()
        Next
      Next
    EndIf
  EndIf
  ProcedureReturn Image2
EndProcedure

If LoadImage(0, "image.bmp")
  Image2 = CryptImage(0)
  SaveImage(Image2, "crypté.bmp")
  Image3 = DecryptImage(Image2)
  SaveImage(Image3, "decrypté.bmp")
EndIf

Publié : dim. 31/mai/2009 17:44
par Ollivier
Si chaque composante n'avait que deux niveaux. Par exemple, si le rouge n'avait que les valeurs 0 à 1 au lieu de 0 à 255, si tu as un dépassement, tu dois faire un rattrapage du NOMBRE DE NIVEAU (=2) et non de la valeur max (=1).

Résultat: En 256 niveaux par composante, tu dois rattraper par une valeur de 256 et non une valeur de 255.

Code : Tout sélectionner

If Rouge > 255
   Rouge - 256
EndIf
Ensuite, pour ce type d'algorithme, il est plus simple de remplacer ce type de routine

Code : Tout sélectionner

If Rouge > 255
   Rouge - 256
EndIf
par

Code : Tout sélectionner

Rouge & 255
C'est plus simple, plus rapide et ça évite donc de telles erreurs. :wink:

Ollivier

Publié : dim. 31/mai/2009 18:08
par djes
Ou alors tu utilises pour tes composantes le type .b ou le type .c :)

Code : Tout sélectionner

rouge.b = 250
rouge+15
Debug rouge

Publié : dim. 31/mai/2009 18:16
par tonton
il aura toujours des erreur par ce procédé.
on sait pas ce qui depasse ....

If Rouge > 255 ( ca peut etre 256,278,369 )
Rouge - 256 ( et on enleve 256)
EndIf

Publié : dim. 31/mai/2009 18:26
par case
tu fais cela dans quel but ? modifier les valeurs de couleurs pour des effets visuels ou simplement rendre l'image illisible sans la décoder ?

Code : Tout sélectionner

Procedure CryptImage(File.s,out.s)

 If LoadImage(0, File)

  If CreateImage(1, ImageWidth(0), ImageHeight(0), ImageDepth(0))

   For x=0 To ImageWidth(0)-1

    For y=0 To ImageHeight(0)-1

     StartDrawing(ImageOutput(0))

     Color = Point(x,y)

     StopDrawing()
     Red = Red(Color)
     r2=red<<4       
     r3=PeekC(@r2)
     r4=PeekC(@r2+1)
     red=r3|r4



     Green = Green(Color)
     r2=Green<<4       
     r3=PeekC(@r2)
     r4=PeekC(@r2+1)
     Green=r3|r4
     
     
     
     blue = Blue(Color)
     r2=blue<<4       
     r3=PeekC(@r2)
     r4=PeekC(@r2+1)
     blue=r3|r4



     StartDrawing(ImageOutput(1))

     Plot(x,y,RGB(Red, Green, Blue))

     StopDrawing()

    Next

   Next

   SaveImage(1, out.s)

  EndIf

 EndIf

EndProcedure

     
UsePNGImageDecoder()
     

CryptImage("imageoxd.png","test1.bmp")
CryptImage("test1.bmp","test2.bmp")
j'inverse les 4 premier bits avec les 4 dernier bits de chaque composantes rvb de l'image ca donne un resultat illisible et ça restaure l'image parfaitement avec une seule procedure ;)

Publié : dim. 31/mai/2009 19:14
par tonton
ou le bon vieux XOR!

Code : Tout sélectionner

Procedure CryptImage(Image) 
  Image2 = 0 
  RedAdd = 25 
  GreenAdd = 128 
  BlueAdd = 212 
  
  If IsImage(Image) 
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image)) 
    If Image2 
      For x=0 To ImageWidth(Image)-1 
        For y=0 To ImageHeight(Image)-1 
          StartDrawing(ImageOutput(Image)) 
          Color = Point(x,y) 
          StopDrawing() 
          StartDrawing(ImageOutput(Image2)) 
          Red = Red(Color)!RedAdd
          Green = Green(Color)!GreenAdd 
          Blue = Blue(Color)!BlueAdd 
          
       
          Plot(x,y,RGB(Red,Green,Blue)) 
          StopDrawing() 
        Next 
      Next 
    EndIf 
  EndIf 
  ProcedureReturn Image2 
EndProcedure 

Procedure DecryptImage(Image) 
  Image2 = 0 
  RedAdd = 25 
  GreenAdd = 128 
  BlueAdd = 212 
  
  If IsImage(Image) 
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image)) 
    If Image2 
      For x=0 To ImageWidth(Image)-1 
        For y=0 To ImageHeight(Image)-1 
          StartDrawing(ImageOutput(Image)) 
          Color = Point(x,y) 
          StopDrawing() 
          StartDrawing(ImageOutput(Image2)) 
          Red = Red(Color) ! RedAdd 
          Green = Green(Color) ! GreenAdd 
          Blue = Blue(Color) ! BlueAdd 
          
        
          Plot(x,y,RGB(Red,Green,Blue)) 
          StopDrawing() 
        Next 
      Next 
    EndIf 
  EndIf 
  ProcedureReturn Image2 
EndProcedure 

If LoadImage(0, "c:\image.bmp") 
  Image2 = CryptImage(0) 
  SaveImage(Image2, "c:\crypté.bmp") 
  Image3 = DecryptImage(Image2) 
  SaveImage(Image3, "c:\decrypté.bmp") 
EndIf

Publié : dim. 31/mai/2009 20:11
par djes
Les procédés de cryptage par Xor ou inversion des bits sont trop connus, et détruisent complètement l'image; je ne vois pas trop l'intérêt :?

Publié : dim. 31/mai/2009 20:40
par tonton
heu!! djes, ca détruit pas l' image... 8O arf!! c' est la Feria..j oubliai..

de plus il ne souhaite pas envoyer une image a "Ben Laden"

Publié : dim. 31/mai/2009 20:46
par case
ben on ne sait pas quel but poursuit lepiaf, comme il utilise le terme cryptage dans son programme j'en ai déduit que c'etait peut être pour rendre les images inexploitables sans les décrypter. et xor et l'inversion de bits sont des manières d'y arriver

Publié : dim. 31/mai/2009 21:33
par djes
tonton a écrit :heu!! djes, ca détruit pas l' image... 8O arf!! c' est la Feria..j oubliai..

de plus il ne souhaite pas envoyer une image a "Ben Laden"
Non, je sais, mais j'entends par là que l'image codée est brouillée.

incessante requête

Publié : dim. 31/mai/2009 22:06
par beauregard
djes a écrit :l'image codée est brouillée.
c'est ce qui manque à pb... comme pour glbasic, un cryptage d'image avec un simple bouton dans l'ide... tant pis.

Publié : dim. 31/mai/2009 22:37
par Backup
..........