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:
ajout de rouge:
retour à l'image de depart:
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!!!
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:
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.
Ensuite, pour ce type d'algorithme, il est plus simple de remplacer ce type de routine
par
C'est plus simple, plus rapide et ça évite donc de telles erreurs.
Ollivier
Publié : dim. 31/mai/2009 18:08
par djes
Ou alors tu utilises pour tes composantes le type .b ou le type .c
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...

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...

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
..........