OVH Cloud OVH Cloud

Comment visualiser un fichier image en *.tif

22 réponses
Avatar
pierre.rivet
Bonjour à tous,

Je cherche le moyen d'afficher un fichier *.tif dans une page de VB

Avec les contrôles Image et PictureBox, on affiche très bien les fichiers
*.bmp, *.jpg et *.gif
mais avec les images *.tif l'ordinateur me renvoie le message "Image
incorrecte dans la procédure suivante:

=====================================================================
Public Sub AFFICHERADIO(TextCheminImage As String)

On Error GoTo Information
Image1.Picture = LoadPicture(TextCheminRadio)
Picture1.Picture = LoadPicture(TextCheminRadio)
Image1.Top = 0
Image1.Left = 0
Largeur = Picture1.Width
Hauteur = Picture1.Height

KL = 7070 / Largeur
KH = 10000 / Hauteur
If KL <= KH Then
K = KL
Else
K = KH
End If
Image1.Width = Largeur * K
Image1.Height = Hauteur * K

Exit Sub

Information:
MsgBox Err.Description
TextCheminRadio = ""
End Sub
===================================================

Merci à l'avance de votre aide,

Pierre

10 réponses

1 2 3
Avatar
Jacques93
pierre.rivet a écrit :
Pardon Jacques,



Tu n'as pas à t'excuser :-)

J'ai essayé de travailler dessus une partie de l'après midi, mais sans
succès pour l'instant.

En fait depuis tout à l'heure j'utilise plutôt la fonction DRawImage:, comme
ci-dessous:



[...]

Ce que je voudrais, c'est adapter la feuille à la taille de l'image, à
condition que les dimensions de la feuille ne dépassent pas l'écran.
Certaines images prises avec des appareils photos numériques sont beaucoup
trop grandes si j'utilise mon dimensionnement ci-dessus.

Les chiffres 15.4 / 16.5 / 19 sont des chiffres obtenus pas tâtonnements,
mais pas rigoureux.

Vois-tu un peu plus clair dans mon problème ?




Je pense, oui. En fait il faut dimensionner la feuille avant d'afficher
l'image, et pour cela il faut connaître les dimensions de cette dite
image. Pour ne pas trop casser le code existant, en premier lieu on
ajoute une fonction dans le module 'ModImage.bas' qui permet de
récupérer la taille, on pourra optimiser ensuite :

Public Function GetImageSize(ByRef vsFilePath As String, _
ByVal vnTargetDC As Long, _
ByRef nWidth As Single, _
ByRef nHeight As Single) As Boolean
Dim lpSI As GdiplusStartupInput
Dim hGdipToken As Long
Dim hTargetGraphics As Long
Dim hImage As Long

GetImageSize = False
lpSI.GdiplusVersion = 1
GdiplusStartup hGdipToken, lpSI

If GdipCreateFromHDC(vnTargetDC, hTargetGraphics) = Gp_Ok Then
If GdipLoadImageFromFile(W(vsFilePath), hImage) = Gp_Ok Then
'# On récupère les dimensions de l'image...
If GdipGetImageDimension(hImage, nWidth, nHeight) = Gp_Ok Then
GetImageSize = True
End If
End If
End If
GdiplusShutdown hGdipToken
End Function


Et dans le code de la feuille :

Option Explicit

' Pour la hauteur de la barre de titre
Private Const SM_CYCAPTION = 4
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long


Private Sub Form_Load()
Dim nWidth As Single
Dim nHeight As Single

Me.ScaleMode = vbPixels
If GetImageSize(App.Path & "Image.tif", _
Me.hdc, nWidth, nHeight) Then
Me.width = nWidth * Screen.TwipsPerPixelX
' SM_CYCAPTION renvoie la hauteur de la barre de titre
' à prendre en compte dans la hauteur totale de la feuille
Me.height = (nHeight + GetSystemMetrics(SM_CYCAPTION)) * _
Screen.TwipsPerPixelY

' Centre la feuille sur l'écran
Me.Left = (Screen.width - Me.width) / 2
Me.Top = (Screen.height - Me.height) / 2

' Affiche l'image
DrawImage App.Path & "Image.tif", Me.hdc, 0, 0, _
Me.ScaleWidth, Me.ScaleHeight, 1, 0
'# On force le raffraichissement
Me.Refresh
End If
End Sub


Reste à gérer les images trop grandes ... Ce qui peut se faire en
récupérant la taille de l'écran avec GetSystemMetrics et les constantes
SM_CXSCREEN et SM_CYSCREEN :

<http://msdn2.microsoft.com/en-us/library/ms724385(VS.85).aspx>

mais n'hésites pas à revenir si tu as un souci :-)

--
Cordialement,

Jacques.
Avatar
pierre.rivet
Merci Jacques,

Résultats au delà de toute attente....

promis, demain matin je "chiade" le cas de figure des images un peu grandes.

Bonne soirée,

Pierre

"Jacques93" a écrit dans le message de news:
%
pierre.rivet a écrit :
Pardon Jacques,



Tu n'as pas à t'excuser :-)

J'ai essayé de travailler dessus une partie de l'après midi, mais sans
succès pour l'instant.

En fait depuis tout à l'heure j'utilise plutôt la fonction DRawImage:,
comme ci-dessous:



[...]

Ce que je voudrais, c'est adapter la feuille à la taille de l'image, à
condition que les dimensions de la feuille ne dépassent pas l'écran.
Certaines images prises avec des appareils photos numériques sont
beaucoup trop grandes si j'utilise mon dimensionnement ci-dessus.

Les chiffres 15.4 / 16.5 / 19 sont des chiffres obtenus pas
tâtonnements, mais pas rigoureux.

Vois-tu un peu plus clair dans mon problème ?




Je pense, oui. En fait il faut dimensionner la feuille avant d'afficher
l'image, et pour cela il faut connaître les dimensions de cette dite
image. Pour ne pas trop casser le code existant, en premier lieu on
ajoute une fonction dans le module 'ModImage.bas' qui permet de récupérer
la taille, on pourra optimiser ensuite :

Public Function GetImageSize(ByRef vsFilePath As String, _
ByVal vnTargetDC As Long, _
ByRef nWidth As Single, _
ByRef nHeight As Single) As Boolean
Dim lpSI As GdiplusStartupInput
Dim hGdipToken As Long
Dim hTargetGraphics As Long
Dim hImage As Long

GetImageSize = False
lpSI.GdiplusVersion = 1
GdiplusStartup hGdipToken, lpSI

If GdipCreateFromHDC(vnTargetDC, hTargetGraphics) = Gp_Ok Then
If GdipLoadImageFromFile(W(vsFilePath), hImage) = Gp_Ok Then
'# On récupère les dimensions de l'image...
If GdipGetImageDimension(hImage, nWidth, nHeight) = Gp_Ok Then
GetImageSize = True
End If
End If
End If
GdiplusShutdown hGdipToken
End Function


Et dans le code de la feuille :

Option Explicit

' Pour la hauteur de la barre de titre
Private Const SM_CYCAPTION = 4
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long


Private Sub Form_Load()
Dim nWidth As Single
Dim nHeight As Single

Me.ScaleMode = vbPixels
If GetImageSize(App.Path & "Image.tif", _
Me.hdc, nWidth, nHeight) Then
Me.width = nWidth * Screen.TwipsPerPixelX
' SM_CYCAPTION renvoie la hauteur de la barre de titre
' à prendre en compte dans la hauteur totale de la feuille
Me.height = (nHeight + GetSystemMetrics(SM_CYCAPTION)) * _
Screen.TwipsPerPixelY

' Centre la feuille sur l'écran
Me.Left = (Screen.width - Me.width) / 2
Me.Top = (Screen.height - Me.height) / 2

' Affiche l'image
DrawImage App.Path & "Image.tif", Me.hdc, 0, 0, _
Me.ScaleWidth, Me.ScaleHeight, 1, 0
'# On force le raffraichissement
Me.Refresh
End If
End Sub


Reste à gérer les images trop grandes ... Ce qui peut se faire en
récupérant la taille de l'écran avec GetSystemMetrics et les constantes
SM_CXSCREEN et SM_CYSCREEN :

<http://msdn2.microsoft.com/en-us/library/ms724385(VS.85).aspx>

mais n'hésites pas à revenir si tu as un souci :-)

--
Cordialement,

Jacques.


Avatar
pierre.rivet
Bonjour Jacques,

Comme tu me l'avais proposé, je reviens vers toi, car je ne parviens pas à
réduire la taille de mes images trop grandes.
Je t'ai mis ci-dessous la code utilisé, avec des commentaires destinés à ta
perspicacité....:-))

Ce que je t'ai mis est bien entendu un résumé des nombreux essais effectués.

Merci encore,

Pierre

========================================================== Private Sub Form_Load()

On Error GoTo Erreur
Me.ScaleMode = vbPixels
If GetImageSize(CheminImage, Me.hdc, nWidth, nHeight) Then
Me.width = nWidth * Screen.TwipsPerPixelX
' SM_CYCAPTION renvoie la hauteur de la barre de titre
' à prendre en compte dans la hauteur totale de la feuille
Me.height = (nHeight + GetSystemMetrics(SM_CYCAPTION)) * _
Screen.TwipsPerPixelY

' Centre la feuille sur l'écran
'Me.Left = (Screen.width - Me.width) / 2
'Me.Top = (Screen.height - Me.height) / 2
Me.Left = 500
Me.Top = 500
Me.Caption = CheminImage

' Affiche l'image
DrawImage CheminImage, Me.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 1,
0

'# On force le rafraîchissement
Me.Refresh

'LargeurEcran = GetSystemMetrics(SM_CXSCREEN)
' HauteurEcran = GetSystemMetrics(SM_CYSCREEN)
'=>Jacques ça ne fonctionne pas bien, ou je ne sais pas m'en servir

End If

'ci-dessous, commentaires pour Jacques

If Me.height > 9000 Or Me.width > 12000 Then
'On cherche le rapport pour diviser la taille de l'image
KH = Me.height / 9000
KL = Me.width / 12000
If KH > KL Then
K = KH
Else
K = KL
End If

'je divise les dimensions de l'image par K
nWidth = nWidth / K
nHeight = nHeight / K

'je relance le chargement de l'image
DrawImage CheminImage, Me.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 1, 0
Me.Refresh
Me.width = nWidth * Screen.TwipsPerPixelX
Me.height = (nHeight + GetSystemMetrics(SM_CYCAPTION)) *
Screen.TwipsPerPixelY

'mais j'ai toujours la même taille
'alors
'j'essaie de diviser la taille de la page par K
Me.width = Me.width / K
Me.height = Me.height / K

'la taille de l'écran est bien divisée, mais je perds une bonne partie
de l'image ?
'Y a -t-il un paramètre du type Stretch ?
End If

Erreur:
End Sub
================================================================ >> Reste à gérer les images trop grandes ... Ce qui peut se faire en
récupérant la taille de l'écran avec GetSystemMetrics et les constantes
SM_CXSCREEN et SM_CYSCREEN :

<http://msdn2.microsoft.com/en-us/library/ms724385(VS.85).aspx>

mais n'hésites pas à revenir si tu as un souci :-)

--
Cordialement,

Jacques.






Avatar
Jacques93
Bonjour pierre.rivet,
pierre.rivet a écrit :
Bonjour Jacques,

Comme tu me l'avais proposé, je reviens vers toi, car je ne parviens pas à
réduire la taille de mes images trop grandes.
Je t'ai mis ci-dessous la code utilisé, avec des commentaires destinés à ta
perspicacité....:-))

Ce que je t'ai mis est bien entendu un résumé des nombreux essais effectués.




[...]

Voici une méthode, pas parfaite, qui ajuste la taille de l'image en
conservant le rapport largeur / hauteur, si l'une des deux dépasse la
taille de l'écran, et tiens également compte de la surface "utile", cad
hors barre de tâches (SystemParametersInfo) :

Option Explicit

Private Const SPI_GETWORKAREA = 48
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function SystemParametersInfo Lib "user32" Alias _
"SystemParametersInfoA" (ByVal uAction As Long, _
ByVal uParam As Long, _
ByRef lpvParam As Any, _
ByVal fuWinIni As Long) As Long

Private Const SM_CXSCREEN = 0
Private Const SM_CYSCREEN = 1
Private Const SM_CYCAPTION = 4
Private Const SM_CXBORDER = 5
Private Declare Function GetSystemMetrics Lib "user32" _
(ByVal nIndex As Long) As Long


Private Sub Form_Load()
Dim ImagePath As String
Dim nWidth As Single, nHeight As Single
Dim WorkWidth As Single, WorkHeight As Single
Dim WorkRect As RECT
Dim RatioX As Single, RatioY As Single
Dim TitleHeight As Single, BorderWidth As Single

ImagePath = App.Path & "conguel.tif"
SystemParametersInfo SPI_GETWORKAREA, 0&, WorkRect, 0&
WorkWidth = (WorkRect.Right - WorkRect.Left) * Screen.TwipsPerPixelX
WorkHeight = (WorkRect.Bottom - WorkRect.Top) * Screen.TwipsPerPixelY
TitleHeight = GetSystemMetrics(SM_CYCAPTION) * Screen.TwipsPerPixelY
BorderWidth = GetSystemMetrics(SM_CXBORDER) * Screen.TwipsPerPixelX * 2
If GetImageSize(ImagePath, Me.hdc, nWidth, nHeight) Then
nWidth = nWidth * Screen.TwipsPerPixelX
nHeight = nHeight * Screen.TwipsPerPixelY
RatioX = 1
RatioY = 1
If nWidth > WorkWidth Then
RatioX = WorkWidth / nWidth
End If
If nHeight > WorkHeight Then
RatioY = WorkHeight / nHeight
End If
Me.Caption = ImagePath
Me.width = nWidth * (IIf(RatioX < RatioY, RatioX, RatioY)) + _
BorderWidth
Me.height = nHeight * IIf(RatioX < RatioY, RatioX, RatioY) + _
TitleHeight + BorderWidth
Me.Left = (Screen.width - Me.width) / 2
Me.Top = (Screen.height - Me.height) / 2
DrawImage ImagePath, Me.hdc, _
WorkRect.Left, WorkRect.Top, _
(Me.width - BorderWidth) / _
Screen.TwipsPerPixelX, _
(Me.height - TitleHeight - BorderWidth) / _
Screen.TwipsPerPixelY, _
1, 0
Me.Refresh
End If
End Sub




--
Cordialement,

Jacques.
Avatar
Jacques93
Jacques93 a écrit :

[...]

Me.Left = (Screen.width - Me.width) / 2
Me.Top = (Screen.height - Me.height) / 2
DrawImage ImagePath, Me.hdc, _
WorkRect.Left, WorkRect.Top, _
(Me.width - BorderWidth) / _
Screen.TwipsPerPixelX, _
(Me.height - TitleHeight - BorderWidth) / _
Screen.TwipsPerPixelY, _
1, 0



remplacer par :

Me.Left = (WorkWidth - Me.width) / 2
Me.Top = (WorkHeight - Me.height) / 2
DrawImage ImagePath, Me.hdc, _
0, 0, _
(Me.width - BorderWidth) / _
Screen.TwipsPerPixelX, _
(Me.height - TitleHeight - BorderWidth) / _
Screen.TwipsPerPixelY, _
1, 0
--
Cordialement,

Jacques.
Avatar
pierre.rivet
Bonjour Jacques,

Tu vas encore dire que je m'excuse à chaque fois que je te réponds.....:-))
mais je n'ai pris connaissance de tes messages que depuis une heure environ.

Je n'aurai qu'un seul mot: BRAVO et encore Merci,

Bonne fin de semaine,

Pierre



"Jacques93" a écrit dans le message de news:

Jacques93 a écrit :

[...]

Me.Left = (Screen.width - Me.width) / 2
Me.Top = (Screen.height - Me.height) / 2
DrawImage ImagePath, Me.hdc, _
WorkRect.Left, WorkRect.Top, _
(Me.width - BorderWidth) / _
Screen.TwipsPerPixelX, _
(Me.height - TitleHeight - BorderWidth) / _
Screen.TwipsPerPixelY, _
1, 0



remplacer par :

Me.Left = (WorkWidth - Me.width) / 2
Me.Top = (WorkHeight - Me.height) / 2
DrawImage ImagePath, Me.hdc, _
0, 0, _
(Me.width - BorderWidth) / _
Screen.TwipsPerPixelX, _
(Me.height - TitleHeight - BorderWidth) / _
Screen.TwipsPerPixelY, _
1, 0
--
Cordialement,

Jacques.


Avatar
Jacques93
Bonjour pierre.rivet,
pierre.rivet a écrit :
Bonjour Jacques,

Tu vas encore dire que je m'excuse à chaque fois que je te réponds.....:-))
mais je n'ai pris connaissance de tes messages que depuis une heure environ.



Non, non. Chacun fait en fonction de ses disponibilités :-)
En tout cas, je ne te jette pas la pierre.

Je n'aurai qu'un seul mot: BRAVO et encore Merci,



Merci à toi

Bonne fin de semaine,




A toi aussi.

Pour ceux qui ne connaissent pas, l'image "Conguel.tif", que j'ai
indiqué dans le code et utilisée a été récupérée sur le forum Bretagne
de news.zoo-logique.org. Ca se trouve sur la presqu'île de Quiberon (A
la différence de la Belgique, fait toujours beau en Bretagne, par contre
y z'ont les frites et la bière ;-) ) :

<http://cjoint.com/?dbtBvcMlx3>

A propos, conserves tu le format tif pour de question de qualité d'image ?
pour cjoint j'ai du la mettre en JPG (200 Ko au lieu de 4,5 Mo)

--
Cordialement,

Jacques.
Avatar
touriste
Bonjour,

Une précision concernant XnView, vous pouvez soit utiliser l'activeX
soit utiliser directement les fonctions de la SDK. Si vous la
téléchargez des exemples VB sont fournis avec, pour la petite histoire
il y a deux fonctions de mon cru dans les modules publiques des exemples.

A+
Christophe

Décidément GDI+ c'est pas mon truc, et c'est lent ...
Avatar
Jean-marc
Jacques93 wrote:
Bonjour pierre.rivet,
pierre.rivet a écrit :
Bonjour Jacques,





Pour ceux qui ne connaissent pas, l'image "Conguel.tif", que j'ai
indiqué dans le code et utilisée a été récupérée sur le forum Bretagne
de news.zoo-logique.org. Ca se trouve sur la presqu'île de Quiberon (A
la différence de la Belgique, fait toujours beau en Bretagne, par
contre y z'ont les frites et la bière ;-) ) :



Olivier de Kersauzon, que je croise de temps en temps à la Trinité,
a coutume de dire : "En Bretagne, il ne pleut que sur les cons.".

En ce moment en belgique, il fait un temps très breton, avec un
agréable petit crachin... On s'y croirait!

Bon dimanche,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Jean-marc,
Jean-marc a écrit :
Jacques93 wrote:
Bonjour pierre.rivet,
pierre.rivet a écrit :
Bonjour Jacques,





Pour ceux qui ne connaissent pas, l'image "Conguel.tif", que j'ai
indiqué dans le code et utilisée a été récupérée sur le forum Bretagne
de news.zoo-logique.org. Ca se trouve sur la presqu'île de Quiberon (A
la différence de la Belgique, fait toujours beau en Bretagne, par
contre y z'ont les frites et la bière ;-) ) :



Olivier de Kersauzon, que je croise de temps en temps à la Trinité,
a coutume de dire : "En Bretagne, il ne pleut que sur les cons.".



Ouh la la, attention, terrain glissant, il a été copié y'a peu (juste à
la fin de la video) :

<http://www.youtube.com/watch?v=Pye1jYwuMx0>

La dernière fois que je l'ai vu, de loin (Kersauzon), il était planté
dans l'entrée de la rivière de Merrien (Moëlan sur Mer) sur le trimaran
Meccarillos, ça date un peu ... C'était un départ de Lorient / Saint
Barth, je crois, mais pas sur. On a bien cru qu'il finirait sa course là ...

En ce moment en belgique, il fait un temps très breton, avec un
agréable petit crachin... On s'y croirait!

Bon dimanche,




A toi aussi :-)

--
Cordialement,

Jacques.
1 2 3