ROTATION & ZOOM SUR UNE BITMAP EN TEMPS REEL

cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 - 12 sept. 2006 à 02:47
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 - 29 juil. 2008 à 16:35
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39521-rotation-zoom-sur-une-bitmap-en-temps-reel

cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
29 juil. 2008 à 16:35
Si tu gere toi meme l'affichage tu peux aussi faire un zbuffer
ou chaque pixel contiendra l'index de l'objet quiest dessiné dessus et ainsi recuperer l'objet a n'importe quel endroi de ton image.

@+
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 juil. 2008 à 16:03
PtInRegion, pardon ^^

http://msdn.microsoft.com/en-us/library/ms536645(VS.85).aspx

Rgn certaines fois, Region d'autres.... super pratique ^^
Besoin_d_Aide Messages postés 4 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 29 juillet 2008
29 juil. 2008 à 16:01
Bonjour Renfield,

Merci de me répondre aussi vite mais j'avoue que je ne comprends pas grand chose !
Je vais chercher un exemple sur l'API PtInReg quant à l'autre méthode je ne vois pas du tout ce que c'est ! Si tu as un exemple, il sera le bien venu !

Encore merci

Olivier
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 juil. 2008 à 15:29
tu pourras faire une detection avec l'API PtInRgn

ou toute autre detection de collision quadrilatere/point
Besoin_d_Aide Messages postés 4 Date d'inscription lundi 20 août 2007 Statut Membre Dernière intervention 29 juillet 2008
29 juil. 2008 à 15:26
Bonjour,

Je viens de tester ce code : SUPER !
Je cherche ce genre d'application depuis quelques jours et je commençais à désespérer !!

Encore merci.

Cependant j'ai une petite question :
Je cherche à faire un soft permettant de placer plusieurs images sur un fond (uni) en effectuant au préalable une rotation (pour chaque image séparément).
j'en suis encore qu'à la phase 'développement intellectuel' (pas encore une seule ligne de code)
Je pensais donc utiliser ce code pour la rotation et ensuite utiliser une sorte de Drag & Drop.

(Voici la question) Une fois toutes les images placées sur le support (avec rotation ou non) est-il possible lorsque je passe la souris dessus ('MouseMove') de savoir sur quelle image je suis ??

Par avance merci

Olivier

P.S. : Si je ne suis pas assez clair, n'hésitez pas j'essaierai de faire mieux.
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
24 juil. 2007 à 14:26
OK C'est trouvé
En fait, c'est faire une miniature
des images de plus de 20000x20000 que je voulais.
Et ce genre d'image ne peut être traiter en mémoire.
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
21 juil. 2007 à 12:57
NON!
pas [PointduFichier] pourra être de n'importe quel couleur
Mais le BMP paurra être 16bits,24bits, 16 ou 256 couleurs
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
21 juil. 2007 à 10:57
Tu connais PlgBl
Très très très puissant comme api!
il y a un exmple d'utilisation sur www.ActiveVB.de
je ne me rappelle plus exactement le lien

Private Declare Function PlgBlt Lib "gdi32.dll" ( _
ByVal hdcDest As Long, _
lpPoint As POINTAPI, _
ByVal hdcSrc As Long, _
ByVal nXSrc As Long, _
ByVal nYSrc As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hbmMask As Long, _
ByVal xMask As Long, _
ByVal yMask As Long) As Long

Mais il travail directement sur le hdc.
Toi tu travail l'image en mémoire.
avec un tableau du style image(x,y).

J'ai fait une fonction pour récupérer
une zone d'image du style x,y,w,h d'un bitmap
directement dans le fichier et quelque soit le nombre de couleur.
Les images que je gère font plus de 20000x20000.
Ce genre d'image ne peut etre chargé en mémoire.
Je m'embrouillais avec ce multiple de 4 et ta formule m'a permis de terminer.

Maintenant, je voudrais une miniature de l'image.
Récupérer les point dans le fichier,
les miniaturiser et l'envoyer dans un tableau du style image(z).

je pense qu'il faut que je transforme tes boucles
For dy = 0 To (Dh - 1)
For dx = 0 To (dw - 1)
With bSrc(Sx, Sy)
If ((.r <> bMsk.r) Or (.g <> bMsk.g) Or (.b <> bMsk.b)) Then
bDst(Dmx, Dmy) = bSrc(Sx, Sy)
End If
End With
next
next

en une seule boucle
et que bDst(Dmx, Dmy) = bSrc(Sx, Sy)
devra être du style bDst(Dmz)=[PointduFichier]
[PointduFichier] pourra être de n'importe quel couleur

AS-TU UNE PISTE
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
20 juil. 2007 à 17:52
Tropic>De rien
cs_Tropic Messages postés 90 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 1 février 2011
20 juil. 2007 à 09:47
Merci pour cette formule
TailleAligné = (TailleNormal + 3) And Not 3
henrimaselati Messages postés 6 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 25 septembre 2007
23 févr. 2007 à 10:29
Super sympa, sauf que l'image est coupe dans les coins? comment faire pour que ca donne l'image complete. merci EBArtsoft
de m'aider. j'ai vraiment besoin du code.

merci
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
16 sept. 2006 à 22:58
EBArtSoft>Je viens juste de rentrer.
Super ton prog couvre toutes mes espérances:-o
J'aurais l'occasion hélas de le tester plus longuement demain fin de journée pour cause de déplacement.
Je te remercie beaucoup pour avoir fait ce que tu as dit ce qui est rare de nos jours.
Bonne prog.
A +
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
16 sept. 2006 à 13:49
MisterN> hope this could help ;)
http://www.vbfrance.com/code.aspx?ID=39583

@+
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
15 sept. 2006 à 14:46
EBArtSoft>Merci pour ton engagement.
A +
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
15 sept. 2006 à 00:26
misterN> ok je devrais pouvoir poster la source demain ou apres demain surveil bien ton browser ;)

Hey Afyn ? tes meme pas connecté sur msn l'astico !

@+
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
14 sept. 2006 à 23:16
Balaise ... comme d'hab !

Yop

Afyn
Navedac
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 sept. 2006 à 10:38
on manipule bien ici la mémoire
mais pas la mémoire vidéo, nous avons ici un DIB (Device Independant Bitmap) donc stocké dans la RAM, dans un format connu, manipulable.

ne t'inquiète pas pour la taille de l'image par rapport a la resolution de l'écran, les PCs actuels sont largement capables d'avoirs 'quelques' fois la taille de l'ecran en mémoire ^^
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
13 sept. 2006 à 10:21
@Ebarsoft: Déjà merci pour SavePicture vraiment si simple.

D'autre part je voudrais juste une confirmation. Ne serait-il pas plus simple d'avoir la largeur de l'image originale en multiple de 4 et récupérer ses dimensions au runtime?
Que se passera t-il alors si la taille de l'image originale est plus grande que la résolution d'écran, si je ne me suis pas trompé EB, tu manipules l'image à partir de la mémoire vidéo?
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
12 sept. 2006 à 21:55
EBArtSoft>Une aide de cette qualité me sera grandement utile car j'en ai besoin actuellement à mon travail pour visualiser et redresser très rapidement des prises de vues de chantiers...et ne sais comment et par où commencer...
Merci d'avance
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
12 sept. 2006 à 21:49
MisterN> Presque ! La taille en Y (Height) na pas besoin d'etre aligné seule la taille en X (procédé du scanline dans le sens de la longeure). Malheureusement on ne peut pas modifier directement la propriete width sauf si la resolution est effectivement 24 bits sinon l'image resultante aura la meme resolution que le systeme. On ce retrouverais pas exemple avec une source en 32 bits et une image destination en 24. Cela dit plusieurs solutions sont envisageable si vous en avez vraiment besoin je me pencherais dessus

@+
misterN Messages postés 40 Date d'inscription samedi 21 août 2004 Statut Membre Dernière intervention 14 décembre 2012
12 sept. 2006 à 21:29
Salut à tous,
Chapeau à EBArtSoft une fois encore pour ce code.
Est-ce que l'on peut m'éclairer si je ne vois pas ce qui peut paraître évident?...:-(
TailleAligné = (TailleNormal + 3) And Not 3 je le comprends comme :
Width de l'image = (Width de l'image + 3 pixels) And Not 3
Height de l'image = (Height de l'image + 3 pixels) And Not 3
Est-ce que ceci peut être la parade au cas où Width et(ou) Height
ne sont pas multiples de 4 ou comment régler ce problème alors...
D'avance merci et bonne prog.
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
12 sept. 2006 à 20:21
Et l'octet supplementaire sert en VB à définir une couleur system (vbButtonFace par exemple), mais on ne s'en sert pas dans une image.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
12 sept. 2006 à 16:36
Ahah... marrant vos petites hypothese ;p

Bon alors je rectifie :

- Pour extraire l'image dans l'ide tu ouvres paint tu clique bouton droit sur la picturebox et tu fait copié dans paint tu fait clique droit puis coller puis menu -> enregistrer sous !

- Pour extraire en run time : SavePicture Picture1,"Image.bmp"

- L'image doit avoir une taille multiple de 4 ?
On parle de sa taille en X ! c'est a dire le Picture1.ScaleWidth
Pourquoi ? tout simplement par ce que l'on traite des données RGB c'est a dire 1 octet pour le rouge 1 pour le vert 1 pour le bleue ! Ces données on les exploite sous forme de tableau VB (x,y) hors VB pour une question d'optimisation exploite des données aligné sur 4 octets (usage de registre 32 bits). CE qui va ce passer si on utilise une image non aligné c'est que l'image sera decalé ! car a la fin d'un scanline ou d'une ligne si vous preferé VB va ajouté les octet manquant et donc empieté sur la ligne suivante !

Ce probleme peut facilement etre resolu en créant une image aligné dynamiquement pour obtenir la taille d'une image aligné sur 4 octet il suffit de faire l'operation suivante :

TailleAligné = (TailleNormal + 3) And Not 3

@+
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
12 sept. 2006 à 15:56
orf -_- lol
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
12 sept. 2006 à 15:47
Ah nos messages se sont croisés ^^
Bon ben c'était pas ça :-(
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
12 sept. 2006 à 15:46
Attention, j'ai emis une simple hypothèse car je ne suis pas du tout sûr de mon coup.
Donc ne pas prendre pour argent comptant et à confirmer !
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 sept. 2006 à 15:46
et non, ca ne viens pas de là ^^
ici, on fait pointer notre tableau où il faut, c'est tout....
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
12 sept. 2006 à 15:44
Ahh ok je vois
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
12 sept. 2006 à 15:41
A mon avis cela vient de là :
MemoryCopy ByVal VarPtrArray(bSrc), VarPtr(SA1), 4
Les bytes seraient traités 4 par 4 ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 sept. 2006 à 15:12
pas la taille du fichier, ca m'étonnerai fort ^^
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
12 sept. 2006 à 15:09
"l'image source doit avoir une taille multiple de 4" > aie, mais il s'agit de la taille du fichier ou des dimensions de l'image ? (et pourquoi 4 au passage?)

Sinon c'est une source super pratique
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
12 sept. 2006 à 14:00
"Autre chose le fichier frmMain.frx sans le frmMain.frm est-il suffisant pour exploiter son contenu?" > Exploiter le contenu de quoi?

Si je me souviens bien, les fichiers frx sont constitué ainsi: [longueur1](4octets)[donnée1](longueur1)[longueur2](4octects)[donnée2](longueur2) etc...
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
12 sept. 2006 à 13:42
Merci Renfield, oué ça marche, je me limitais au menu contextuel qui n'affichait pas copier alors j'ai pas cherché plus loin, grrrr ..., pourtant l'option copier est activée à partir du menu Edition.


Dommage je n'ai pas d'aide il me faut toujours aller chercher sur internet, juste une petite précision, avec "GetObject Src.Picture, Len(BmpS), BmpS" comme le fait EB, la variable BmpS (de type BITMAP) contient l'image du background, il devrait avoir une API qui permette de l'enregistrer sous...


Autre chose le fichier frmMain.frx sans le frmMain.frm est-il suffisant pour exploiter son contenu? Y'a t-il une documentation en ligne pour sa codification.?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 sept. 2006 à 13:22
le copier/coller est possible pour toutes les images, des controles ou de la Form si ce ne sont pas des icones
selectionne l'objet voulu
selectionne la propriété Picture
et presse Ctrl + C
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
12 sept. 2006 à 13:17
effectivement c'est pourquoi j'ai posé la question sous cette source.
Je pense qu'il doit avoir une API ou un petit module que vous pourriez m'écrire pour faire une sorte de enregistrer sous ... de l'image. Il faut noter que le copier/coller n'est pas possible pour le picture du form, or j'ai des forms avec des images qui m'interessent que je voulais extraire.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 sept. 2006 à 13:11
EB a fait un programme qui permet justement de lire les infos des fichiers FRX.

sinon, si ton image est de type Bitmap (pas une Icon) un simple copier/coller suffit
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
12 sept. 2006 à 13:04
Comment serait-il possible par programme d'extraire l'image de la propriété picture d'un form à partir des fichiers "frmname.frm" et "frmname.frx"?

Dans le cas du picturebox "ps" de cette appli, l'image peut être extraite par copier/coller. Comment aurait-il été possible de l'avoir par programme via les fichiers frmMain.frm et frmMain.frx?
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
12 sept. 2006 à 11:49
Effectivement, le problème viens de la résolution.
Je suis en 1024 * 768 et BmpS.bmBitsPixel = 16

Si je passe en 800 * 600 ==> BmpS.bmBitsPixel = 24
Et là cela fonctionne.
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
12 sept. 2006 à 11:30
Bouv> c'est surement un des garde fou qui a sauté ! Execute le programme en mode pas a pas. Et regarde cette ligne la => If (BmpS.bmBitsPixel <> 24) Then Exit Sub

Puis essaie de changer de resolution

@+
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
12 sept. 2006 à 10:54
Non BmpD.bmBits n'est pas nul. En fait j'ai bien l'arrière plan mais pas le ninja.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 sept. 2006 à 10:39
vérifie que BmpD.bmBits ne soit pas nul (DFB au lieu d'un DIB)
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
12 sept. 2006 à 10:14
Je sais pas pourquoi mais, chez moi cela n'affiche pas le ninja.

Et sans commentaires je ne pige pas grand chose. Du coup je peux pas dire d'où ça vient.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
12 sept. 2006 à 07:07
hehe, un moement que j'avais ca en tête, histoire d'aller encore plus vite qu'un Set/GetDibBits :p
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
12 sept. 2006 à 02:47
excellent boulot ! :)
Rejoignez-nous