OVH Cloud OVH Cloud

Question d'image...

12 réponses
Avatar
Sébastien Côté
Bonjour à tous!

Voila mon problème, j'aimerais savoir comment sélectionner une partie d'une
image JPEG et la sauvegarder à nouveau. Par exemple, si j'ai une image qui
est de taille 800x600 je veux sélectionner la partie du haut de l'image,
ex.: Coordonnées 0,0 à 800,300, comment faire ??

Merci à l'avance

Seb

10 réponses

1 2
Avatar
ng
Salut,
Regarde du coté de PaintPicture, BitBlt et StrechtBlt...

Nicolas.

"Sébastien Côté" a écrit dans le message de
news: 7jinb.2018$
Bonjour à tous!

Voila mon problème, j'aimerais savoir comment sélectionner une partie


d'une
image JPEG et la sauvegarder à nouveau. Par exemple, si j'ai une image qui
est de taille 800x600 je veux sélectionner la partie du haut de l'image,
ex.: Coordonnées 0,0 à 800,300, comment faire ??

Merci à l'avance

Seb




Avatar
Sébastien Côté
Oui, je sais bien j'ai tenté avec ce que je croyais la bonne utilisation:

result = BitBlt(Picture2.hDC, 0, 0, 658, _
472, Picture1.hDC, 100, 189, &HC0020)

(Picture1 est mon origine, et Picture2 ma destination)
Et mon picture2 ne change pas, reste vide.

Seb

"ng" a écrit dans le message de
news:
Salut,
Regarde du coté de PaintPicture, BitBlt et StrechtBlt...

Nicolas.

"Sébastien Côté" a écrit dans le message de
news: 7jinb.2018$
> Bonjour à tous!
>
> Voila mon problème, j'aimerais savoir comment sélectionner une partie
d'une
> image JPEG et la sauvegarder à nouveau. Par exemple, si j'ai une image


qui
> est de taille 800x600 je veux sélectionner la partie du haut de l'image,
> ex.: Coordonnées 0,0 à 800,300, comment faire ??
>
> Merci à l'avance
>
> Seb
>
>






Avatar
Zoury
Salut Seb! :O)

C'est ton vrai code?

HC0020



la vrai constante vaut &HCC0020 (il te manque un C) et se nomme vbSrcCopy.
Emploi la c'est plus facile à lire ainsi.. ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Sébastien Côté
Merci beaucoup et vraiment... c'était con de ma part!

Seb

"Sébastien Côté" a écrit dans le message de
news:kzBnb.5789$
Oui, je sais bien j'ai tenté avec ce que je croyais la bonne utilisation:

result = BitBlt(Picture2.hDC, 0, 0, 658, _
472, Picture1.hDC, 100, 189, &HC0020)

(Picture1 est mon origine, et Picture2 ma destination)
Et mon picture2 ne change pas, reste vide.

Seb

"ng" a écrit dans le message de
news:
> Salut,
> Regarde du coté de PaintPicture, BitBlt et StrechtBlt...
>
> Nicolas.
>
> "Sébastien Côté" a écrit dans le message


de
> news: 7jinb.2018$
> > Bonjour à tous!
> >
> > Voila mon problème, j'aimerais savoir comment sélectionner une partie
> d'une
> > image JPEG et la sauvegarder à nouveau. Par exemple, si j'ai une image
qui
> > est de taille 800x600 je veux sélectionner la partie du haut de


l'image,
> > ex.: Coordonnées 0,0 à 800,300, comment faire ??
> >
> > Merci à l'avance
> >
> > Seb
> >
> >
>
>
>
>




Avatar
Sébastien Côté
Maintenant, comment faire pour éviter que les autres controles apparaissent
(Par exemple, la barre des taches) car c'est uniquement ce qui est visible a
l'écran qui est copié.

Seb

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Seb! :O)

C'est ton vrai code?

>HC0020

la vrai constante vaut &HCC0020 (il te manque un C) et se nomme vbSrcCopy.
Emploi la c'est plus facile à lire ainsi.. ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
Zoury
Salut Sébastien! :O)

Maintenant, comment faire pour éviter que les autres controles


apparaissent
(Par exemple, la barre des taches) car c'est uniquement ce qui est visible


a
l'écran qui est copié.



J'suis un peu perdu... :O)
tu ne cherchais pas extraire une partie d'une image?
Peux-tu expliquer ce que tu veux et nous montrer le code que tu as?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
François Picalausa
Bonjour/soir,
pourquoi ne pas simplement utiliser painpicture?
Si tu as besoin de plus de performances, bitblt est à utiliser mais si tu
peux te permettre d'en avoir peu...

Picture1.ScaleMode = 3
Picture1.PaintPicture img.Image, 0, 0, , , , , 200, 200

Aussi, penses à toujours type tes variables...
Dim result
prend une place énorme (pour un variant) alors que tu n'as besoin de 4
octets (long)
Rien ne t'empêche non plus d'utiliser Call MaFonction si tu ne te sers pas
de la valeur de retour

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


"Sébastien Côté" a écrit dans le message
de news:e7Spb.695$
Voici. Remarquez le bouton qui apparait grrrrrrrrrrrr...

J'ai du te produire un test car mon projet pèse plusieurs megs...

Merci de trouver la solution pour copier une partie de cette image,
ou d'une image stockée dans un .jpg et de la resauvegarder/afficher

Seb


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message
de news:%
Salut Sébastien! :O)

Maintenant, comment faire pour éviter que les autres controles
apparaissent (Par exemple, la barre des taches) car c'est
uniquement ce qui est visible a l'écran qui est copié.



J'suis un peu perdu... :O)
tu ne cherchais pas extraire une partie d'une image?
Peux-tu expliquer ce que tu veux et nous montrer le code que tu as?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml -
http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à
tous




Avatar
Zoury
Salut Sébastien! :O)

Une partie du bouton est copié car cette partie embarque par dessus l'image
que tu copie. Déplace le et réessai.

Maintenant, je trouve le code compliqué et l'utilisation de
GetPixels/SetPixels est moins performante que l'API BitBlt... :O)

Avant tout :

1. désolé pour les longues lignes..
2. image.bmp est une image de 200 x 200 pixels..
3. le projet suivant sera posté dans le message qui suivra..

Regarde l'exemple suivant :
'***
' Form1
' 5 PictureBoxes
' 1 CommandButton
Option Explicit

Private Const MARGIN As Long = 5 ' pixels
Private Const BOX_WIDTH As Long = 200 ' pixels
Private Const SMALL_BOX_WIDTH = (BOX_WIDTH - MARGIN) 2 ' pixels

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 _
) As Long

Private Sub Command1_Click()
Call SplitImage
End Sub

Private Sub Form_Load()
Me.ScaleMode = vbPixels
Picture1.ScaleMode = vbPixels
Picture2.ScaleMode = vbPixels
Picture3.ScaleMode = vbPixels
Picture4.ScaleMode = vbPixels
Call SetControls
Set Picture1.Picture = LoadPicture(App.Path & "image.bmp")
End Sub

Private Sub SetControls()
Dim lTitleBarHeight As Long
Dim lWindowWidth As Long
lTitleBarHeight = Me.Height - Me.ScaleY(Me.ScaleHeight, vbPixels,
vbTwips)
lWindowWidth = Me.Width - Me.ScaleX(Me.ScaleWidth, vbPixels, vbTwips)
Call Me.Move(0, 0, (BOX_WIDTH * 2 + MARGIN * 3) * Screen.TwipsPerPixelX
+ lWindowWidth, (BOX_WIDTH + MARGIN * 3 + Command1.Height) *
Screen.TwipsPerPixelY + lTitleBarHeight)
Call Picture1.Move(MARGIN, MARGIN, BOX_WIDTH, BOX_WIDTH)
Call Picture2.Move(Picture1.Left + Picture1.Width + MARGIN, MARGIN,
SMALL_BOX_WIDTH, SMALL_BOX_WIDTH)
Call Picture3.Move(Picture2.Left + Picture2.Width + MARGIN, MARGIN,
SMALL_BOX_WIDTH, SMALL_BOX_WIDTH)
Call Picture4.Move(Picture2.Left, Picture2.Top + Picture2.Height +
MARGIN, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH)
Call Picture5.Move(Picture3.Left, Picture4.Top, SMALL_BOX_WIDTH,
SMALL_BOX_WIDTH)
Call Command1.Move(Picture5.Left + Picture5.Width - Command1.Width,
Picture5.Top + Picture5.Height + MARGIN)
Command1.Caption = "Split"
Command1.Default = True
End Sub

Private Sub SplitImage()
Call BitBlt(Picture2.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, 0, 0, vbSrcCopy)
Call BitBlt(Picture3.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, SMALL_BOX_WIDTH + MARGIN, 0, vbSrcCopy)
Call BitBlt(Picture4.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, 0, SMALL_BOX_WIDTH + MARGIN, vbSrcCopy)
Call BitBlt(Picture5.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, SMALL_BOX_WIDTH + MARGIN, SMALL_BOX_WIDTH + MARGIN, vbSrcCopy)
End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Sébastien Côté
J'apprécie vraiment ton aide, mais je crois m'être mal exprimé. En fait
cette opération devrait être invisible pour l'utilisateur final, c'est
pourquoi dans mon logiciel je mets mon objet à visibleúlse ou le recouvre.

Seb

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Salut Sébastien! :O)

Une partie du bouton est copié car cette partie embarque par dessus


l'image
que tu copie. Déplace le et réessai.

Maintenant, je trouve le code compliqué et l'utilisation de
GetPixels/SetPixels est moins performante que l'API BitBlt... :O)

Avant tout :

1. désolé pour les longues lignes..
2. image.bmp est une image de 200 x 200 pixels..
3. le projet suivant sera posté dans le message qui suivra..

Regarde l'exemple suivant :
'***
' Form1
' 5 PictureBoxes
' 1 CommandButton
Option Explicit

Private Const MARGIN As Long = 5 ' pixels
Private Const BOX_WIDTH As Long = 200 ' pixels
Private Const SMALL_BOX_WIDTH = (BOX_WIDTH - MARGIN) 2 ' pixels

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 _
) As Long

Private Sub Command1_Click()
Call SplitImage
End Sub

Private Sub Form_Load()
Me.ScaleMode = vbPixels
Picture1.ScaleMode = vbPixels
Picture2.ScaleMode = vbPixels
Picture3.ScaleMode = vbPixels
Picture4.ScaleMode = vbPixels
Call SetControls
Set Picture1.Picture = LoadPicture(App.Path & "image.bmp")
End Sub

Private Sub SetControls()
Dim lTitleBarHeight As Long
Dim lWindowWidth As Long
lTitleBarHeight = Me.Height - Me.ScaleY(Me.ScaleHeight, vbPixels,
vbTwips)
lWindowWidth = Me.Width - Me.ScaleX(Me.ScaleWidth, vbPixels, vbTwips)
Call Me.Move(0, 0, (BOX_WIDTH * 2 + MARGIN * 3) *


Screen.TwipsPerPixelX
+ lWindowWidth, (BOX_WIDTH + MARGIN * 3 + Command1.Height) *
Screen.TwipsPerPixelY + lTitleBarHeight)
Call Picture1.Move(MARGIN, MARGIN, BOX_WIDTH, BOX_WIDTH)
Call Picture2.Move(Picture1.Left + Picture1.Width + MARGIN, MARGIN,
SMALL_BOX_WIDTH, SMALL_BOX_WIDTH)
Call Picture3.Move(Picture2.Left + Picture2.Width + MARGIN, MARGIN,
SMALL_BOX_WIDTH, SMALL_BOX_WIDTH)
Call Picture4.Move(Picture2.Left, Picture2.Top + Picture2.Height +
MARGIN, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH)
Call Picture5.Move(Picture3.Left, Picture4.Top, SMALL_BOX_WIDTH,
SMALL_BOX_WIDTH)
Call Command1.Move(Picture5.Left + Picture5.Width - Command1.Width,
Picture5.Top + Picture5.Height + MARGIN)
Command1.Caption = "Split"
Command1.Default = True
End Sub

Private Sub SplitImage()
Call BitBlt(Picture2.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, 0, 0, vbSrcCopy)
Call BitBlt(Picture3.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, SMALL_BOX_WIDTH + MARGIN, 0, vbSrcCopy)
Call BitBlt(Picture4.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, 0, SMALL_BOX_WIDTH + MARGIN, vbSrcCopy)
Call BitBlt(Picture5.hDC, 0, 0, SMALL_BOX_WIDTH, SMALL_BOX_WIDTH,
Picture1.hDC, SMALL_BOX_WIDTH + MARGIN, SMALL_BOX_WIDTH + MARGIN,


vbSrcCopy)
End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous




Avatar
Sébastien Côté
Merci... je me sens vraiment ridicule...

C'était probablement trop facile !!!!

Un gros merci encore!!

Seb

"François Picalausa" a écrit dans le message de
news:%
Bonjour/soir,
pourquoi ne pas simplement utiliser painpicture?
Si tu as besoin de plus de performances, bitblt est à utiliser mais si tu
peux te permettre d'en avoir peu...

Picture1.ScaleMode = 3
Picture1.PaintPicture img.Image, 0, 0, , , , , 200, 200

Aussi, penses à toujours type tes variables...
Dim result
prend une place énorme (pour un variant) alors que tu n'as besoin de 4
octets (long)
Rien ne t'empêche non plus d'utiliser Call MaFonction si tu ne te sers pas
de la valeur de retour

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


"Sébastien Côté" a écrit dans le message
de news:e7Spb.695$
> Voici. Remarquez le bouton qui apparait grrrrrrrrrrrr...
>
> J'ai du te produire un test car mon projet pèse plusieurs megs...
>
> Merci de trouver la solution pour copier une partie de cette image,
> ou d'une image stockée dans un .jpg et de la resauvegarder/afficher
>
> Seb
>
>
> "Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message
> de news:%
>> Salut Sébastien! :O)
>>
>>> Maintenant, comment faire pour éviter que les autres controles
>>> apparaissent (Par exemple, la barre des taches) car c'est
>>> uniquement ce qui est visible a l'écran qui est copié.
>>
>> J'suis un peu perdu... :O)
>> tu ne cherchais pas extraire une partie d'une image?
>> Peux-tu expliquer ce que tu veux et nous montrer le code que tu as?
>>
>> --
>> Cordialement
>> Yanick Lefebvre - MVP pour Visual Basic
>> http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
>> http://www.mentalis.org/agnet/apiguide.shtml -
>> http://www.mztools.com/
>>
>> Merci de poster les réponses au groupe afin d'en faire profiter à
>> tous




1 2