Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment découper 1 image en plusieurs???

8 réponses
Avatar
surfeur75
Bonjour,

Alors je voudrais faire un puzzle, et actuellement je prédécoupe mes
images, mais j'aurais voulu le découper grâce au code, donc partir d'une
image, par exemple de 100*100 et en faire 10 images(i) de 10*10...

Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne sais pas
comment remettre chaque découpe dans une nouvelle image plus petite. Voici
ce que j'ai commencé:

Dim couleur(1323, 1323) As Long
Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base à
découper
'découpe
For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met 20
secondes
For j = 1 To 1323
couleur(i, j) = Form1.Point(i, j)
Next j
Next i

Faudrait déjà trouver une méthode découpe plus rapide, et ensuite, je ne
sais pas comment remettre mes pixels de la découpe, dans une nouvelle image
plus petite.

Si quelqu'un a une idée, une méthode ?
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!

8 réponses

Avatar
ng
Salut,

Non utilise plutot PaintPicture (méthode d'un objet PictureBox), BitBlt ou
encore StrechBlt (APIs GDI), je te fais un exemple dès que j'ai d'installé
VB sur cette machine ;-)

Nicolas.

"surfeur75" a écrit dans le message de news:
OU6v$#
Bonjour,

Alors je voudrais faire un puzzle, et actuellement je prédécoupe mes
images, mais j'aurais voulu le découper grâce au code, donc partir d'une
image, par exemple de 100*100 et en faire 10 images(i) de 10*10...

Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne sais


pas
comment remettre chaque découpe dans une nouvelle image plus petite. Voici
ce que j'ai commencé:

Dim couleur(1323, 1323) As Long
Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base à
découper
'découpe
For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met 20
secondes
For j = 1 To 1323
couleur(i, j) = Form1.Point(i, j)
Next j
Next i

Faudrait déjà trouver une méthode découpe plus rapide, et ensuite, je


ne
sais pas comment remettre mes pixels de la découpe, dans une nouvelle


image
plus petite.

Si quelqu'un a une idée, une méthode ?
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!






Avatar
François Picalausa
Bonjour/soir,

A noter qu'on peut aussi travailler avec un pictureclip.. je ne sais pas
exactement ce qu'il vaut mais je pense qu'il peut tout à fait convenir pour
ce genre de tâches.

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"surfeur75" a écrit dans le message de
news:OU6v$%
Bonjour,

Alors je voudrais faire un puzzle, et actuellement je prédécoupe
mes images, mais j'aurais voulu le découper grâce au code, donc
partir d'une image, par exemple de 100*100 et en faire 10 images(i)
de 10*10...

Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne
sais pas comment remettre chaque découpe dans une nouvelle image plus
petite. Voici ce que j'ai commencé:

Dim couleur(1323, 1323) As Long
Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base à
découper
'découpe
For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met 20
secondes
For j = 1 To 1323
couleur(i, j) = Form1.Point(i, j)
Next j
Next i

Faudrait déjà trouver une méthode découpe plus rapide, et
ensuite, je ne sais pas comment remettre mes pixels de la découpe,
dans une nouvelle image plus petite.

Si quelqu'un a une idée, une méthode ?


Avatar
Christophe
Bonsoir,

Il faut charger l'image dans un DC en memoire compatible avec l'écran créer
à l'aide de createcompatibleDC&(0&).
en utilisant un objet DIBsection. Puis le transferer sur un DC de
périphérique (pictureBox par exemple) en combinant les jeux de coordonnées
(pixel pour le DIB et mode de mapping pour le DC destnation) pour le
découper à l'affichage en fonction de ce que tu souhaite.

Cette methode te permet de creer autant de pieces que tu le souhaties tout
en n'ayant qu'une image en mémoire

Christophe Vergon

ci dessous les déclarations API necessaires::

Private Declare Function CreateCompatibleDC& Lib "gdi32" (ByVal hdc As Long)

Private Declare Function BitBlt& Lib "gdi32" (ByVal hDestDC As Long, ByVal x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long)

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal
hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal nSrcWidth As
Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

Private Declare Function DeleteDC& Lib "gdi32" (ByVal hdc As Long)

Private Declare Function CreateDIBSection& Lib "gdi32" (ByVal hdc As Long,
pBitmapInfo As BITMAPINFO, ByVal un As Long, lplpVoid As Long, ByVal Handle
As Long, ByVal dw As Long)
Private Declare Function SetDIBColorTable& Lib "gdi32" (ByVal hdc As Long,
ByVal un1 As Long, ByVal un2 As Long, pcRGBQuad As RGBQUAD)

Private Declare Function SetStretchBltMode& Lib "gdi32" (ByVal hdc As Long,
ByVal nStretchMode As Long)

Private Declare Function StretchDIBits& Lib "gdi32" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal
SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight
As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long,
ByVal dwRop As Long)




"surfeur75" a écrit dans le message de news:
OU6v$#
Bonjour,

Alors je voudrais faire un puzzle, et actuellement je prédécoupe mes
images, mais j'aurais voulu le découper grâce au code, donc partir d'une
image, par exemple de 100*100 et en faire 10 images(i) de 10*10...

Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne sais


pas
comment remettre chaque découpe dans une nouvelle image plus petite. Voici
ce que j'ai commencé:

Dim couleur(1323, 1323) As Long
Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base à
découper
'découpe
For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met 20
secondes
For j = 1 To 1323
couleur(i, j) = Form1.Point(i, j)
Next j
Next i

Faudrait déjà trouver une méthode découpe plus rapide, et ensuite, je


ne
sais pas comment remettre mes pixels de la découpe, dans une nouvelle


image
plus petite.

Si quelqu'un a une idée, une méthode ?
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!






Avatar
Jean-Marc
"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

A noter qu'on peut aussi travailler avec un pictureclip.. je ne sais pas
exactement ce qu'il vaut mais je pense qu'il peut tout à fait convenir


pour
ce genre de tâches.



Bonjour,

effectivment, le PictureClip est parfait pour ça;
je joins ici un petit exemple, tiré tel quel de la doc, qui illustre le
fonctionnement de la chose. Voir la doc pour plus de détails bien sur.

The following example displays a Clip image in a picture box when the user
specifies X and Y coordinates and then clicks a form. First create a form
with a PictureBox, a PictureClip control, and two TextBox controls. At
design time, use the Properties sheet to load a valid bitmap into the
PictureClip control.

Private Sub Form_Click ()
Dim SaveMode As Integer
' Save the current ScaleMode for the picture box.
SaveMode = Picture1.ScaleMode
' Get X and Y coordinates of the clipping region.
PicClip1.ClipX = Val(Text1.Text)
PicClip1.ClipY = Val(Text2.Text)
' Set the area of the clipping region (in pixels).
PicClip1.ClipHeight = 100
PicClip1.ClipWidth = 100
' Set the picture box ScaleMode to pixels.
Picture1.ScaleMode = 3
' Set the destination area to fill the picture box.
PicClip1.StretchX = Picture1.ScaleWidth
PicClip1.StretchY = Picture1.ScaleHeight
' Assign the clipped bitmap to the picture box.
Picture1.Picture = PicClip1.Clip
' Reset the ScaleMode of the picture box.
Picture1.ScaleMode = SaveMode
End Sub
Avatar
surfeur75
Merci, je vais étudier la question dés ce soit, si je ne comprends pas otut,
je t'écrirais...
Si ton adresse 'est pas bonne, veux-tu me la donner ?
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!


"ng" a écrit dans le message de news:

Salut,

Voici l'exemple.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


"ng" a écrit dans le message de news:

> Salut,
>
> Non utilise plutot PaintPicture (méthode d'un objet PictureBox), BitBlt


ou
> encore StrechBlt (APIs GDI), je te fais un exemple dès que j'ai


d'installé
> VB sur cette machine ;-)
>
> Nicolas.
>
> "surfeur75" a écrit dans le message de news:
> OU6v$#
> > Bonjour,
> >
> > Alors je voudrais faire un puzzle, et actuellement je prédécoupe


mes
> > images, mais j'aurais voulu le découper grâce au code, donc partir


d'une
> > image, par exemple de 100*100 et en faire 10 images(i) de 10*10...
> >
> > Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne


sais
> pas
> > comment remettre chaque découpe dans une nouvelle image plus petite.
Voici
> > ce que j'ai commencé:
> >
> > Dim couleur(1323, 1323) As Long
> > Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base à
> > découper
> > 'découpe
> > For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met 20
> > secondes
> > For j = 1 To 1323
> > couleur(i, j) = Form1.Point(i, j)
> > Next j
> > Next i
> >
> > Faudrait déjà trouver une méthode découpe plus rapide, et ensuite,
je
> ne
> > sais pas comment remettre mes pixels de la découpe, dans une nouvelle
> image
> > plus petite.
> >
> > Si quelqu'un a une idée, une méthode ?
> > --
> > @+, bye, Joe.
> > Pour m'écrire ng75AROBASEnoosPOINTfr
> > remplace AROBASE et POINT par leur vrai signe
> > Il l'a fait car il ne savait pas que c'était impossible, alea jacta


est!
> >
> >
> >
> >
>
>





Avatar
surfeur75
Bonjour, mon pauvre ami, merci, mais je n'y comprends pas grand chose, après
l'avoir relu plusieurs fois j'en ai la certitude, ce n'est pas du français,
et pourtant nous sommes dans un NG "FR", si tu avais la même chose dans
notre bonne langue???
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!


"Jean-Marc" a écrit dans le message de news:
401d5712$0$7034$
"François Picalausa" a écrit dans le message de
news:
> Bonjour/soir,
>
> A noter qu'on peut aussi travailler avec un pictureclip.. je ne sais pas
> exactement ce qu'il vaut mais je pense qu'il peut tout à fait convenir
pour
> ce genre de tâches.

Bonjour,

effectivment, le PictureClip est parfait pour ça;
je joins ici un petit exemple, tiré tel quel de la doc, qui illustre le
fonctionnement de la chose. Voir la doc pour plus de détails bien sur.

The following example displays a Clip image in a picture box when the user
specifies X and Y coordinates and then clicks a form. First create a form
with a PictureBox, a PictureClip control, and two TextBox controls. At
design time, use the Properties sheet to load a valid bitmap into the
PictureClip control.

Private Sub Form_Click ()
Dim SaveMode As Integer
' Save the current ScaleMode for the picture box.
SaveMode = Picture1.ScaleMode
' Get X and Y coordinates of the clipping region.
PicClip1.ClipX = Val(Text1.Text)
PicClip1.ClipY = Val(Text2.Text)
' Set the area of the clipping region (in pixels).
PicClip1.ClipHeight = 100
PicClip1.ClipWidth = 100
' Set the picture box ScaleMode to pixels.
Picture1.ScaleMode = 3
' Set the destination area to fill the picture box.
PicClip1.StretchX = Picture1.ScaleWidth
PicClip1.StretchY = Picture1.ScaleHeight
' Assign the clipped bitmap to the picture box.
Picture1.Picture = PicClip1.Clip
' Reset the ScaleMode of the picture box.
Picture1.ScaleMode = SaveMode
End Sub




Avatar
surfeur75
Bonjour, merci de ta réponse, je vais d'abord voir la solution que notre ami
NG m'a envoyé dans sa réponse sur le forum, elle me paraît plus simple que
la tienne, reste à voir si elle est assez rapide, je vois ça ce soir...
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!


"Christophe" <geo.ch@(wormfuck)tiscali.fr> a écrit dans le message de news:
bvjk1p$9um$
Bonsoir,

Il faut charger l'image dans un DC en memoire compatible avec l'écran


créer
à l'aide de createcompatibleDC&(0&).
en utilisant un objet DIBsection. Puis le transferer sur un DC de
périphérique (pictureBox par exemple) en combinant les jeux de coordonnées
(pixel pour le DIB et mode de mapping pour le DC destnation) pour le
découper à l'affichage en fonction de ce que tu souhaite.

Cette methode te permet de creer autant de pieces que tu le souhaties tout
en n'ayant qu'une image en mémoire

Christophe Vergon

ci dessous les déclarations API necessaires::

Private Declare Function CreateCompatibleDC& Lib "gdi32" (ByVal hdc As


Long)

Private Declare Function BitBlt& Lib "gdi32" (ByVal hDestDC As Long, ByVal


x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long,


ByVal
hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As


Long)

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal


x
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long,


ByVal
hSrcDC As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal nSrcWidth As
Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

Private Declare Function DeleteDC& Lib "gdi32" (ByVal hdc As Long)

Private Declare Function CreateDIBSection& Lib "gdi32" (ByVal hdc As Long,
pBitmapInfo As BITMAPINFO, ByVal un As Long, lplpVoid As Long, ByVal


Handle
As Long, ByVal dw As Long)
Private Declare Function SetDIBColorTable& Lib "gdi32" (ByVal hdc As Long,
ByVal un1 As Long, ByVal un2 As Long, pcRGBQuad As RGBQUAD)

Private Declare Function SetStretchBltMode& Lib "gdi32" (ByVal hdc As


Long,
ByVal nStretchMode As Long)

Private Declare Function StretchDIBits& Lib "gdi32" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long,


ByVal
SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal


wSrcHeight
As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long,
ByVal dwRop As Long)




"surfeur75" a écrit dans le message de news:
OU6v$#
> Bonjour,
>
> Alors je voudrais faire un puzzle, et actuellement je prédécoupe mes
> images, mais j'aurais voulu le découper grâce au code, donc partir d'une
> image, par exemple de 100*100 et en faire 10 images(i) de 10*10...
>
> Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne sais
pas
> comment remettre chaque découpe dans une nouvelle image plus petite.


Voici
> ce que j'ai commencé:
>
> Dim couleur(1323, 1323) As Long
> Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base à
> découper
> 'découpe
> For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met 20
> secondes
> For j = 1 To 1323
> couleur(i, j) = Form1.Point(i, j)
> Next j
> Next i
>
> Faudrait déjà trouver une méthode découpe plus rapide, et ensuite,


je
ne
> sais pas comment remettre mes pixels de la découpe, dans une nouvelle
image
> plus petite.
>
> Si quelqu'un a une idée, une méthode ?
> --
> @+, bye, Joe.
> Pour m'écrire ng75AROBASEnoosPOINTfr
> remplace AROBASE et POINT par leur vrai signe
> Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!
>
>
>
>




Avatar
ng
Salut,

Mon adresse est bonne :-) (je sais il parait que c'est inconscient de mettre
sa vraie adresse sur les newsgroups :-))

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/


"surfeur75" a écrit dans le message de news:
#
Merci, je vais étudier la question dés ce soit, si je ne comprends pas


otut,
je t'écrirais...
Si ton adresse 'est pas bonne, veux-tu me la donner ?
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!


"ng" a écrit dans le message de news:

> Salut,
>
> Voici l'exemple.
>
> --
> Nicolas G.
> FAQ VB : http://faq.vb.free.fr
> API Guide : http://www.allapi.net
> Google Groups : http://groups.google.fr/
> MZ-Tools : http://www.mztools.com/
>
>
> "ng" a écrit dans le message de news:
>
> > Salut,
> >
> > Non utilise plutot PaintPicture (méthode d'un objet PictureBox),


BitBlt
ou
> > encore StrechBlt (APIs GDI), je te fais un exemple dès que j'ai
d'installé
> > VB sur cette machine ;-)
> >
> > Nicolas.
> >
> > "surfeur75" a écrit dans le message de news:
> > OU6v$#
> > > Bonjour,
> > >
> > > Alors je voudrais faire un puzzle, et actuellement je prédécoupe
mes
> > > images, mais j'aurais voulu le découper grâce au code, donc partir
d'une
> > > image, par exemple de 100*100 et en faire 10 images(i) de 10*10...
> > >
> > > Lla découpe mets 20 secondes l'image, c'est trop long! Et je ne
sais
> > pas
> > > comment remettre chaque découpe dans une nouvelle image plus petite.



> Voici
> > > ce que j'ai commencé:
> > >
> > > Dim couleur(1323, 1323) As Long
> > > Picture1.Picture = LoadPicture("Image_test_3.bmp") ' image de base


à
> > > découper
> > > 'découpe
> > > For i = 1 To 1323 ' 1ere découpe au pixel pour test, mais ça met


20
> > > secondes
> > > For j = 1 To 1323
> > > couleur(i, j) = Form1.Point(i, j)
> > > Next j
> > > Next i
> > >
> > > Faudrait déjà trouver une méthode découpe plus rapide, et


ensuite,
> je
> > ne
> > > sais pas comment remettre mes pixels de la découpe, dans une


nouvelle
> > image
> > > plus petite.
> > >
> > > Si quelqu'un a une idée, une méthode ?
> > > --
> > > @+, bye, Joe.
> > > Pour m'écrire ng75AROBASEnoosPOINTfr
> > > remplace AROBASE et POINT par leur vrai signe
> > > Il l'a fait car il ne savait pas que c'était impossible, alea jacta
est!
> > >
> > >
> > >
> > >
> >
> >
>
>
>