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

Modifier les pixel d'une image de bouton de barre d'outils

8 réponses
Avatar
Papyjac
Bonjour,

Je remercie Isabelle qui m'a permet d'arriver jusqu'à, mais je bute encore

Je crée le code suivant après avoir trouver plusieurs exemples similaires
sous Visual Basic

Public Declare Function GetPixel Lib "GDI32.DLL" (ByVal hDC As Long, ByVal
XPos As Long, ByVal nYPos As Long) As Long

Sub Test()
'_Afficher les pixels
Dim U_Objet1 As IPictureDisp ' Objet image
Dim X As Long
Dim Y As Long
'-
Set U_Objet1 = stdole.StdFunctions.LoadPicture("C:\Test.bmp")
With U_Objet1
For X = 0 To .Height - 1
For Y = 0 To .Width - 1
If Y < 256 Then
Cells(X + 1, Y + 1) = GetPixel(.Handle, X, Y)
End If
Next
Next
End With
End Sub

Il s'agit d'une fonction de test
A ce stade, la fonction Getpixel renvoie toujours -1, je suppose qu'il
s'agit de FAUX
dès que je trouverais un résultat, je souhaite modifier la bitmap avec
Setpixel avant de l'afficher dans le bouton avec l'instruction .picture =
U_Objet

Je pense que j'ai un problème d'unité PIXEL ou POINTS ou millimettre !?

Peut-être faut il effectuer une conversion de la Bitmap ?

Merci de votre contribution


--
Papyjac

8 réponses

Avatar
Geo
Bonjour


A ce stade, la fonction Getpixel renvoie toujours -1, je suppose qu'il
s'agit de FAUX



Normalement : non, c'est une couleur, donc un nombre combinant
l'amplitude des trois composantes.
Or la valeur maximale dans un nombre est interprétée comme -1
(technique du complément à 2 pour représenter les nombres négatifs),
donc je dirai plutôt : couleur blanche.
Faudrait essayer avec un bouton de couleur.

Je pense que j'ai un problème d'unité PIXEL ou POINTS ou millimettre !?



A priori : non, ce sont bien des pixels.

--
A+
Avatar
Papyjac
Bonjour Geo

Et merci d'étudier mon problème

J'ai scanné les propriétés de l'objet IPictureDisp (U_Objet1 dans l'exemple
ci-dessous)
1. j'ai bien accès au Handle => Il évolue à chaque exécution
2. Width = Height = 423
3. Type = 1
4. HPal = 0

Ce qui est curieux c'est que quand j'utilise une fonction GetObjectAPI, il
me trouve bien Width = Height = 16 ce qui est normal puisque que je travaille
sur la bitmap d'une image de bouton 16 x 16
C'est le 423 qui m'inquiète un peu.
Mais comme je ne sais s'il faut que j'utilise CreateBitmap, BitBlt... etc je
nage dans le brouillard

Public Declare Function GetPixel Lib "GDI32.DLL" (ByVal hDC As Long, ByVal
XPos As Long, ByVal nYPos As Long) As Long

Sub Test()
'_Afficher les pixels
Dim U_Objet1 As IPictureDisp ' Objet image
Dim X As Long
Dim Y As Long
'-
Set U_Objet1 = stdole.StdFunctions.LoadPicture("C:Test.bmp")
With U_Objet1
For X = 0 To .Height - 1
For Y = 0 To .Width - 1
If Y < 256 Then
Cells(X + 1, Y + 1) = GetPixel(.Handle, X, Y)
End If
Next
Next
End With
End Sub

--
Papyjac


"Geo" a écrit :

Bonjour


> A ce stade, la fonction Getpixel renvoie toujours -1, je suppose qu'il
> s'agit de FAUX

Normalement : non, c'est une couleur, donc un nombre combinant
l'amplitude des trois composantes.
Or la valeur maximale dans un nombre est interprétée comme -1
(technique du complément à 2 pour représenter les nombres négatifs),
donc je dirai plutôt : couleur blanche.
Faudrait essayer avec un bouton de couleur.

> Je pense que j'ai un problème d'unité PIXEL ou POINTS ou millimettre !?

A priori : non, ce sont bien des pixels.

--
A+





Avatar
Geo
Bonjour

J'ai scanné les propriétés de l'objet IPictureDisp (U_Objet1 dans l'exemple
ci-dessous)
1. j'ai bien accès au Handle => Il évolue à chaque exécution



exact

2. Width = Height = 423
3. Type = 1
4. HPal = 0

Ce qui est curieux c'est que quand j'utilise une fonction GetObjectAPI, il
me trouve bien Width = Height = 16 ce qui est normal puisque que je travaille
sur la bitmap d'une image de bouton 16 x 16
C'est le 423 qui m'inquiète un peu.



C'est vrai que je n'ai pas vérifié les tailles, mais le résultat est
toujours -1, j'ai essayé avec des x et y négatifs, avec "pas d'image",
c'est à dire le handler à 0, toujours pareil.

je finis par me demander si cette fonction marche encore.
Vous avez essayé de mettre l'image sur votre bouton, telle quelle avec
loadpicture ?

--
A+
Avatar
Geo
Bonjour

2. Width = Height = 423



Ce qui fait un rapport de 26,44, pour mon image j'ai 26,46 sur les deux
dimensions qui ne sont pas égales.
Le type indiqué est HiMetric qui correspondrait à 0,01 mm.
De toutes manières, j'ai fait tourner le programme sur 12700 x 16933
sans jamais avoir autre chose que -1.

Avec la nuit qui tombe en plus du brouillard, c'est sur qu'on n'y voit
goutte.

--
A+
Avatar
Papyjac
Bonjour Geo et merci

Oui, l'image se charge très dans le bouton sans problème. Mon test contient
ce scénario. car je progresse toujours pas à pas : du monde connu vers
l'inconnu et faisant varier peu de chose à chaque fois.

Je fabrique les images sous Paint et les charge sans problème

Je cherche avec mon test en cours à maitrixer les pixel par programme (j'ai
plusieurs exemples en VB qui le faisait, par exemple pour pivoter l'image)
Pour l'instant, ma quête consistera à fusionner 2 images (masque) encore
faut-il que je puisse lire les Pixel (GETPIXEL) et les modifier (SETPIXEL) ou
d'autre instructions aussi pratique

--
Papyjac


"Geo" a écrit :

Bonjour

> J'ai scanné les propriétés de l'objet IPictureDisp (U_Objet1 dans l'exemple
> ci-dessous)
> 1. j'ai bien accès au Handle => Il évolue à chaque exécution

exact

> 2. Width = Height = 423
> 3. Type = 1
> 4. HPal = 0
>
> Ce qui est curieux c'est que quand j'utilise une fonction GetObjectAPI, il
> me trouve bien Width = Height = 16 ce qui est normal puisque que je travaille
> sur la bitmap d'une image de bouton 16 x 16
> C'est le 423 qui m'inquiète un peu.

C'est vrai que je n'ai pas vérifié les tailles, mais le résultat est
toujours -1, j'ai essayé avec des x et y négatifs, avec "pas d'image",
c'est à dire le handler à 0, toujours pareil.

je finis par me demander si cette fonction marche encore.
Vous avez essayé de mettre l'image sur votre bouton, telle quelle avec
loadpicture ?

--
A+





Avatar
Geo
Re

Le seul truc que j'ai obtenu c'est la conversion des tailles :
larg = CentimetersToPoints(.Width) * 4 / 3000
haut = CentimetersToPoints(.Height) * 4 / 3000

Rien de mieux pour le reste.
J'avais fait un peu de traitement d'images mais avec visual studio qui
évolue kui, contrairement au vba.
Encore que pour dessiner il vaut mieux encore le faire avec vb6.

--
A+
Avatar
Papyjac
BOnjour Geo

Et merci pour tes recherches

Je vais explorer une autre piste : créer l'image de toutes pièces sans la
récupérer par loadPicture d'un fichier.bmp

Je ne risque rien d'essayer
--
Papyjac


"Geo" a écrit :

Bonjour

> 2. Width = Height = 423

Ce qui fait un rapport de 26,44, pour mon image j'ai 26,46 sur les deux
dimensions qui ne sont pas égales.
Le type indiqué est HiMetric qui correspondrait à 0,01 mm.
De toutes manières, j'ai fait tourner le programme sur 12700 x 16933
sans jamais avoir autre chose que -1.

Avec la nuit qui tombe en plus du brouillard, c'est sur qu'on n'y voit
goutte.

--
A+





Avatar
Papyjac
Bonjour Geo,

Oui j'ai mesuré la taille du bouton sur l'écran, il fait environ 4 mm soit
400 Himetric comme du dis

Peut être ai-je compris quelque chose ce soir !

Bonne nuit

--
Papyjac


"Geo" a écrit :

Bonjour

> 2. Width = Height = 423

Ce qui fait un rapport de 26,44, pour mon image j'ai 26,46 sur les deux
dimensions qui ne sont pas égales.
Le type indiqué est HiMetric qui correspondrait à 0,01 mm.
De toutes manières, j'ai fait tourner le programme sur 12700 x 16933
sans jamais avoir autre chose que -1.

Avec la nuit qui tombe en plus du brouillard, c'est sur qu'on n'y voit
goutte.

--
A+