Récupérer la largeur et la hauteur d'une image BitMap chargée dans un contrôle i [Résolu]

Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 4 avril 2012 à 10:02
Bonjour à tous,

Une nouvelle question me taquine l'esprit et j'aimerais en savoir plus...

Dans une feuille Excel j'ai un contrôle image (Contrôle ActiveX). C'est un objet de type OLEObject. Je charge une image BitMap dans ce contrôle et j'aimerais savoir quels en sont la largeur et la hauteur de l'image qui est chargée.

J'ai fait des recherches sur le net et malgré plusieurs questions sur le sujet, je n'ai pas trouvé beaucoup de réponses.

Je suis tout de même parvenu à trouver une solution qui fonctionne bien. Mais le code employé ne me parais pas le plus adapté à mon cas de figure. C'est pourquoi je préfère demander ici, s'il existe une autre méthode plus en adéquation.

Je précise que je ne charge par une image dans un contrôle image pour en obtenir la largeur et la hauteur. Je charge l'image dans le contrôle pour la suite de mon projet. Et je me dis que si l'image doit être chargée, alors autant en profiter pour en extraire les données que je veux. Or actuellement le code que j'emploie ne passe pas du tout par le contrôle image mais directement par la ré-ouverture du fichier via Open For Binary Access.

Voici le code qui génère le contrôle image :

'=  =========================================================================================================================
Dim Contrôle_Image1 As OLEObject
'=================================================================
'Création, insertion, placement et dimensionnement d'un object sur la feuille (Contrôle image dans cet exemple)
'Set Contrôle_Image1 ActiveSheet.OLEObjects.Add(ClassType:="Forms.Image.1", Link:=False, _
DisplayAsIcon:=False, Left:=210, Top:=124.5, Width:=123, Height:=49.5)

'=============================================================
'On contrôle ensuite ici l'ensemble des propriétés de l'objet sur lequelles ont souhaite agir
'Contrôle_Image1.Name "Image1"
Contrôle_Image1.Left = Range("R7").Left
Contrôle_Image1.Top = Range("R7").Top
Contrôle_Image1.Width = Range("R7:T5").Width
Contrôle_Image1.Height = Range("R7:T15").Height
Contrôle_Image1.Placement = xlMoveAndSize
Contrôle_Image1.PrintObject = True
Contrôle_Image1.Object.Picture = LoadPicture(Fichier_Image)
Contrôle_Image1.Object.PictureAlignment = 2
Contrôle_Image1.Object.PictureSizeMode = 3
Contrôle_Image1.Object.BackStyle = 0
Contrôle_Image1.Object.SpecialEffect = 6
'========================================================================================================================== 



Voici le code que j'ai trouvé et qui permet d'obtenir la largeur et la hauteur :

Private Type BITMAPFILEHEADER
    bfType As Integer
    bfSize As Long
    bfReserved1 As Integer
    bfReserved2 As Integer
    bfOffBits As Long
End Type

Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long               '<--------------
    biHeight As Long              '<--------------
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type

Public Sub test()
Open Fichier_Image For Binary Access Read Write Lock Write As #1
Dim BMPFileHeader As BITMAPFILEHEADER
Dim BMPInfoHeader As BITMAPINFOHEADER
 
    Get #1, 1, BMPFileHeader
    Get #1, , BMPInfoHeader
Largeur    = BMPInfoHeader.biWidth
Hauteur = BMPInfoHeader.biHeight
End Sub



Comment puis-je améliorer ce code pour le rendre le plus simple simple possible ?

Il me semble qu'il est possible d'utiliser le type suivant :

Type BITMAP
   bmType As Long
   bmWidth As Long
   bmHeight As Long
   bmWidthBytes As Long
   bmPlanes As Integer
   bmBitsPixel As Integer
   bmBits As Long
   End Type



Puis d'obtenir la largeur et la hauteur avec :

Dim bmAPI As BITMAP
With bmAPI
   Largeur = .bmWidth:
   Hauteur = .bmHeight:
End With


Ce code est simple, mais je ne parviens pas à l'utiliser dans mon cas de figure.


Vos idées sont les bienvenues.

Bien cordialement,

André
Afficher la suite 

10/50 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Voilà pour XP : comme pour Vista, mais choisir Apparence et thèmes ===>> modifier la résolution de l'écran ===>> Avancé ===>> général ===>> modifier la DPI


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Sauf qu'après l'avoir augmenté puis redémarré mon portable de test sous XP, la propriété PixelPerInch
dans Excel n'a pas bougé, donc pas d'incidence pour ma conversion de points en pixels ...

Le portable sous Seven est monopolisé par mon aÎnée, je ne pourrai pas le tester aujourd'hui.

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Précision : après avoir redémarrer le PC, les icônes et les polices étaient donc bien plus gros
mais la résolution du fond d'écran n'a pas bougé, idem dans mes images d'un classeur Excel ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
Content de voir que vos différents points de vue tendent à converger

Ça fait plaisir.

Bon dimanche des Rameaux...


André
Commenter la réponse de SERIEUXETCOOL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Le problème reste identique, MarcPL :
- ou, pour une même session de Windows, ce paramètre est modifié (et fausse alors tes calculs)
- ou tu le rétablis systématiquement (et viens contrecarrer) la configuration éventuellement choisie.
Dans les deux cas : un conflit, à éviter. Et il est largement évitable.
Je vais donc m'atteler à "doter" VBA de tout ce dont dispose VB6, à l'identique.
Et il n'y aura plus, ainsi, ni conflit ni risque d'erreur.
Le coût ? Trois fois rien : deux fonctions dans un module bas.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
0
Merci
Je viens de faire le test une seconde fois : la modif dans Windows ne fausse pas le calcul dans Excel ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Commenter la réponse de MarcPL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Mais elle le fausse si on modifie la propriété depuis Excel !
Cela reste donc dangereux et conflictuel, MarcPL.
Enfin ... fais comme tu l'entends (ce sont tes applis, pas les miennes).

J'ai quant à moi dit plus haut :
Je vais donc m'atteler à "doter" VBA de tout ce dont dispose VB6, à l'identique.
Et il n'y aura plus, ainsi, ni conflit ni risque d'erreur.
Le coût ? Trois fois rien : deux fonctions dans un module bas.

et j'ai pour habitude de m'atteler sans attendre à ce à quoi je dis vouloir m'atteler .
Le module est déjà bien avancé, à plus de 97 % (et ce qui est fait fonctionne sans faille).
Y sont déjà traitées toutes les conversions, de toutes les unités vers toutes les autres unités, y compris Char (assez particulier car calcul différent pour la hauteur et pour la largeur) et Himetric et tant horizontalement que verticalement et dans tous les sens imaginables et quelles que soient tant la résolution que le nombre de twips par pixel, même lorsque différents horizontalement et verticalement))
Me reste (fastoche) à offrir dans la foulée deux ou trois autre petites fonctions dans le même module et à en rédiger le mode d'emploi, puis à le déposer.
Son poids actuel n'est (pour l'instant) que de 2,37 kO (vraiment très peu) et je toute fort qu'il dépasse les 3 ko après mes rajouts. Il est par ailleurs extrêmement concentré et rapide.
Je pense que je déposerai tout cela demain après-midi.
Après : chacun en fera ce qu'il voudra ou l'ignorera (ce ne sera plus mon affaire, "comme d'hab", après 15 jours après le dépôt ).
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Voilà qui est fait. Moins de 3 KO ===>>
Offre les équivalents VBA des "facilités" VB6 :
ScaleX, ScaleY, TwipsperPixelX, TwipsperPixelY, TextWidth, TextHeight, Screen.Width et Scree.Height.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
336
Date d'inscription
dimanche 3 avril 2011
Statut
Membre
Dernière intervention
12 juin 2012
1
0
Merci
Salut Ucfoutu,

Je n'ai peut être pas bien vu, mais ou puis-je trouver ce fameux source que tu as développé pour assurer les équivalents VB6 en VBA ?

Je ne vois pas de lien. C'est le matin, je me réveille doucement hein

En tout cas ça m’intéresserai d'y jeter un coup d’œil.

Bonne matinée.
Commenter la réponse de SERIEUXETCOOL
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Bonjour, André,
Ben... dans mes sources, peut-être ===>>
Tapez le texte de l'url ici.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu