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

Comment découper 1 image en plusieurs???

1 réponse
Avatar
surfeur75
Bonjour à tous (sauf à ng),

Ben enfin j'arrive à un résultat, après 2 jours de recherche, faut dire
que je ne connais pas du tout le problème, c'est une première de découper
une image en plusieurs...

Mais j'ai encore de menus problèmes...
D'abord je voudrais dire merci à tous ceux qui m'ont proposé des méthodes
(sauf à ng), j'ai retenu celle de l'API "BitBlt"car elle me semble la plus
simple, l'autre méthode entraîne l'empaquetage d'un dll en sus, et la
dernière avec "call paint machin" (celle de ng justement), ben elle reste
incompréhensible faute de doc... [enfoiré celui-là]!

Je mets mon code, mais ne criez pas, c'est un code de recherche, je
ferais mieux en finalisant, alors voici mes question (à l'exclusion de ng):

-1- L'image numérote depuis 0 ou depuis 1 son unité de mesure ?

-2- Avec l'API "BitBlt" je n'arrive pas à lui passer des twips, elle ne
semble avaler que les pixels, est-ce un état, ou puis-je arriver à lui
passer des twips, et comment (voir mon code), j'ai beau mettre des
scale_machin dans le code, dans la forme, rien n'y fait, y'a que le pixel
qui passe, peut être des paramètres que je n'aurais pas, votre idée (sauf
ng), svp ?

-3- Ben sinon, si vous voyez où je peux mieux faire, avec la même quantité
de code, n'hésitez pas à proposer, merci...

Alors, merci (sauf ng), pour vos lumières ? :o)


teste auto-coupe d'image
'
Option Explicit
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 Const SRCCOPY = &HCC0020
'
Dim i As Long
Dim j As Long
Dim k As Long
Dim cote As Long
Dim rep
'


Sub Form_Activate()
Picture1.Picture = LoadPicture("ImageOrigine.jpg")
End Sub

Sub Form_Load()
ChDrive App.Path
ChDir App.Path
cote = 1335
i = 1
End Sub


Sub m_decoupe_Click()
' imaged'origine = 617 * 441 pixels pour mémoire
' découpe : 6615(largeur origine) = 5(images) * 1323 twips par image
carrée
' découpe : 9261(hauteur origine) = 7(images) * 1323 twips par image
carrée
'
ScaleMode = 1 'twip
Select Case i
Case 1: rep = BitBlt(Picture2(i).hDC, 0, 0, cote, cote, Picture1.hDC, 1,
1, SRCCOPY)
Case 2: rep = BitBlt(Picture2(i).hDC, 0, 0, cote, cote, Picture1.hDC,
85, 0, SRCCOPY)
Case 3: rep = BitBlt(Picture2(i).hDC, 0, 0, cote, cote, Picture1.hDC,
170, 0, SRCCOPY)
Case 4: rep = BitBlt(Picture2(i).hDC, 0, 0, cote, cote, Picture1.hDC,
254, 0, SRCCOPY)
Case 5: rep = BitBlt(Picture2(i).hDC, 0, 0, cote, cote, Picture1.hDC,
338, 0, SRCCOPY)
Case 6: rep = BitBlt(Picture2(i).hDC, 0, 0, cote, cote, Picture1.hDC, 1,
85, SRCCOPY)
End Select
'
i = i + 1
If i > 6 Then
'Set Picture1.Picture = Nothing
Exit Sub
End If
Call m_decoupe_Click
End Sub
--
@+, 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!


--
@+, 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!

1 réponse

Avatar
Christophe
Bonjour


-2- Avec l'API "BitBlt" je n'arrive pas à lui passer des twips, elle ne
semble avaler que les pixels, est-ce un état, ou puis-je arriver à lui
passer des twips, et comment (voir mon code), j'ai beau mettre des
scale_machin dans le code, dans la forme, rien n'y fait, y'a que le pixel
qui passe, peut être des paramètres que je n'aurais pas, votre idée (sauf
ng), svp ?



BitBlt : DC de destination, puis Coin Supgauche destination: en coordonnées
logique du DC de destination
etc ;; et coordonnées logiques dans le DC de départ.
Pour que tes coordonnées soient exprimée en twips il faut que le mode de
mapping du DC soit MM_TWIPS
scalemode=1
Pour que tes coordonnées soient exprimées en pixel il faut que le mode de
mapping du DC soit MM_TEXT (une unité logique = une unité de périphérique),
ce qui est le plus simple., picture1.scalemode=pixel
ou l'api:
Private Declare Function SetMapMode& Lib "gdi32" (ByVal hdc As Long, ByVal
nMapMode As Long)
Si tu veux faire un puzzle comme je te l'ai indiqué dans un post précédent
la meilleur méthode reste de gerer une image complete dans un DC en memoire
et de gerer l'affichage découpé de cette image sur différent pictureBOX.
D'un point de vue code c'est un peu plus ardu mais en efficacité c'est au
top.
Si tu veux travailler efficacement sur les images tu n'echappera pas aux
API.

christophe Vergon