XL 2013 limite des images trop grandes pour le crop excel

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
il y a peu j'ai mis une ressource un tout petit interface pour découper une partie d'image
avant j'utilisais wiaut.dll plus précisément la librairie WIA
aujourd'hui j'utilise le crop d'excel en vba
alors ca fonctionne mais si l'image est trop grande : alors là le découpage est incohérent avec les calculs de pourcentage qui sont juste(verifié)
ça se voit tout de suite dans l’aperçu dans l'interface

quelqu'un saurait quelque chose sur ce point
ci joint 2 image identiques et le cropseur
démonstration du problème
avec l'image originale comme vous le voyez l'appercu en bas à droite n'est pas representatif de la selection dans l'interface


demo.gif



maintenant avec la même image que j'ai réduite en gardant une taille raisonnable de 944 X 549 pixels
et là on vois bien que l'apercu est la parfaite reproduction de la selection
demo.gif


les deux images et le fichier ci joint
 

Pièces jointes

  • créer une portion une image avec une portion de celle ci.xlsm
    47.3 KB · Affichages: 17
  • MSI Leopard 3413x1919.jpg
    MSI Leopard 3413x1919.jpg
    868.1 KB · Affichages: 19
  • MSI Leopard 3413x1919bis .jpg
    MSI Leopard 3413x1919bis .jpg
    187.8 KB · Affichages: 19
Solution
Bonjour patricktoulon, le forum,

J'ai fait un essai basique en prenant les valeurs visibles sur ton gif et n'ai rencontré aucun souci :
  • Crop left = 38,98809
  • Crop top = 28,04975
  • Crop right = 38,09524
  • Crop bottom = 28,57899
L'image finale correspond bien à ta sélection.
Je suppose donc que le problème ne vient pas du crop...
VB:
Sub test()
Dim shp As Shape
Dim initialHeight As Single
Dim initialWidth As Single
    Set shp = Feuil1.Shapes.AddPicture("C:\...\MSI Leopard 3413x1919.jpg", False, True, 0, 0, -1, -1)
    
    With shp
        initialHeight = .Height
        initialWidth = .Width
        .PictureFormat.CropLeft = 38.98809 / 100 * initialWidth...

patricktoulon

XLDnaute Barbatruc
re
avec les grande images je suis obligé de multiplier par 3.25
mais ça ne fonctionne plus sur les plus petites images
demo avec la grande
j'ai tout essayé (round ,inverser les opérande(comme mromain),etc..) rien n'y fait

VB:
w = .width: h = .height
            .PictureFormat.CropLeft = Round(w * Val(crleft.Text) / 100) * 3.25
            .PictureFormat.CropRight = w * (Val(crright) / 100) * 3.25
            .PictureFormat.CropTop = h * (Val(crtop) / 100) * 3.25
            .PictureFormat.CropBottom = h * (Val(crbot) / 100) * 3.25


avec big image.JPG


démo avec les petites

avec small image.JPG


et pour vous prouver que c'est bien un probleme de taille avec le crop excel
la même avec la librairie WIA c'est un fichier qui a plus de 10 ans déjà
démo sur la grande
le principe est le meme avec WIA
VB:
Sub RegImage(Optional x As Long = 0)
    Dim fname As Variant, imgOut
    Dim Img As Object, IP As Object
    If CpR.Visible = True Then
        imgOut = Application.GetSaveAsFilename(InitialFileName:=Environ("userprofile") & "\DeskTop", filefilter:="image Files (*.jpg), *.jpg", Title:="ENREGISTREMENT DE LA CAPTURE")
        If imgOut <> False Then
            Set Img = CreateObject("WIA.ImageFile")
            Set IP = CreateObject("WIA.ImageProcess")
            Img.LoadFile chemin.Value
            IP.Filters.Add IP.FilterInfos("Crop").FilterID
            IP.Filters(1).Properties("Left") = (Img.Width / 100) * Val(cropleft.Value)
            IP.Filters(1).Properties("Top") = (Img.Height / 100) * Val(croptop.Value)
            IP.Filters(1).Properties("Right") = (Img.Width / 100) * Val(cropright.Value)
            IP.Filters(1).Properties("Bottom") = (Img.Height / 100) * Val(cropbottom.Value)
            
            If x = 1 Then    'si le checkbox photo d'identité  est coché
                IP.Filters.Add IP.FilterInfos("Scale").FilterID
                IP.Filters(2).Properties("MaximumWidth") = (3.5 * 28.3465) * P_ToPx
                IP.Filters(2).Properties("MaximumHeight") = (4.5 * 28.3465) * P_ToPx
            End If

c'est donc soit une capacité de mémoire ou un truc du genre

demo.gif
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
pour vous prouver que c'est bien un probleme de taille avec le crop excel
la même avec la librairie WIA c'est un fichier qui a plus de 10 ans déjà
Ça ne prouve pas du tout que le problème vient de la dimension des images.
D'ailleurs, fais comme dans l'exemple de Microsoft dont je t'ai donné le lien et tu verras que ça fonctionne très bien quelle que soit la dimension de l'image.


Bonjour @TooFatBoy
elle est ou ta solution là ?
Elle est dans dans mon lien, dans l'exemple donné par Microsoft.

mon croptleft est défini comme suit
largeur *coeef pourcentage --> en point
je ne vois pas ce qui pourrait être a l'encontre de ce qui est dit dans cette page
je suis curieux de savoir ce que tu a corrigé
C'est pourtant évident : si ça merdoie c'est que le nombre de points n'est pas bon.
Vu que tu n'as que deux paramètres pour calculer ce nombre de points, et que le pourcentage est bon, le problème vient forcément de la largeur !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
C'est pourtant évident : si ça merdoie c'est que le nombre de points n'est pas bon.
heu il faut lire le post en entier pour comprendre
mes calculs sont bons puisque ces mêmes nombres écrit en dur dans le code fonctionnent
c'est un test que mromain a fait en premier ça

je répète je l'ai vu l'exemple
mais mes calculs(qui sont bon) sont fait au déplacement du mask
ce lien m'est donc inutile, la logique du crop je la connais

d'ailleurs si ce n’était pas un soucis de nombre trop grand ou je ne sais quoi qu'est ce,mais bel est bien un problème de valeur alors avec les petites ça ne fonctionnerait pas non plus

j'applique EXACTEMENT !!!! cette même logique de calculs avec WIA et je n'ai pas de soucis avec les grandes ou petites images, et les valeurs sont prises dans les textboxs avec remplacement de la virgule par le point et val
cropleft=largeur *(pourcentage/100)
'et pareil pour les 4 cotés même principe
j'ai meme essayé sur GIMP les pourcentage obtenus et ils sont corrects

alors il s'agirait maintenant d'apporter de vraies solutions
dit toi bien que si je pose une question
c'est que j'ai fouillé partout d'abords
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
mes calculs sont bons puisque ces mêmes nombres écrit en dur dans le code fonctionnent
Non mais t'es sérieux là ?!? 😲

A * B = C
On voit que C n'est pas bon et on sait que B est bon, mais tu ne comprends pas que c'est donc forcément A qui n'est pas bon ??? 🤯🙃🤪



Je t'ai expliqué pourquoi ton programme ne fonctionne pas.
Je t'ai donné la solution. Ainsi qu'on peut le voir dans ma démonstration, elle est évidente.
Ce n'est pas moi qui l'ai inventée, c'est Microsoft himself qui la donne sur le lien que je t'ai donné !

Mais, comme d'hab, tu restes campé sur tes positions et ne doutes pas un instant que tu as forcément raison.
Et pourtant... ton programme merdoie, alors qu'une fois qu'il est corrigé comme dans mon lien il fonctionne.
Mais non bien sûr, j'ai tord et tu as raison... 🙄

Ne changeons pas les bonnes habitudes, à toujours nier les évidences...
Tu nous refais là le même coup que pour l'addition de nombres négatifs et tes valeurs absolues. 😕
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
mais qu'est ce que tu raconte ?
je te dis que le résultat des calculs dans les textboxs sont bon mromain les a essayé en dur dans le code
je l'es ai testé dans WIA et GIMP
qu'est ce qui n'est pas clair la dedans ?

je souhaiterais que tu aie raison crois moi mais ce n'est pas le cas
serieux
il n'y a pas 36 données
il y a un width et un height au départ

qu'est ce qui ne peut pas être bon dans ceci
calcul pourcentage
VB:
'calcul de pourcentage  de chaque cotés
Sub calculCrops()
    On Error Resume Next
    crleft = Replace(((calque.left - Image1.left) * 100) / Image1.width, ",", ".")
    crtop = Replace(((calque.top - Image1.top) * 100) / Image1.height, ",", ".")
    crright = Replace((100 - ((calque.width + calque.left - Image1.left) * 100) / Image1.width), ",", ".")
    crbot = Replace(100 - ((calque.height + calque.top - Image1.top) * 100) / Image1.height, ",", ".")
End Sub

application du crop
VB:
  w = .width: h = .height
            .PictureFormat.CropLeft = w * (Val(crleft.Value) / 100)
            .PictureFormat.CropRight = w * (Val(crright.Value) / 100)
            .PictureFormat.CropTop = h * (Val(crtop.Value) / 100)
            .PictureFormat.CropBottom = h * (Val(crbot.Value) / 100)
il serait tant d'arrêter de te la jouer ;)
et d'arrêtter me prendre pour ce que je ne suis pas en disant que tu a donné la solution
alors que tu n'a rien donné de concret
ta science je m'en cogne , je veux une vraie solution
 

TooFatBoy

XLDnaute Barbatruc
il serait tant d'arrêter de te la jouer ;)
et d'arrêtter me prendre pour ce que je ne suis pas en disant que tu a donné la solution
alors que tu n'a rien donné de concret
ta science je m'en cogne , je veux une vraie solution
Je ne me la joue pas du tout, et comme je te l'ai déjà dit ce n'est pas ma science puisque ce n'est pas moi qui ai pondu la correction de ton programme mais c'est Microsoft qui donne la solution sur le lien que je t'ai donné.


mais qu'est ce que tu raconte ?
je te dis que le résultat des calculs dans les textboxs sont bon mromain les a essayé en dur dans le code
je l'es ai testé dans WIA et GIMP
qu'est ce qui n'est pas clair la dedans ?
Visiblement ce qui n'est pas clair pour toi malgré ma démonstration, c'est que tes w et h sont forcément faux.

je souhaiterais que tu aie raison crois moi mais ce n'est pas le cas
Peut-être me trompé-je, mais dans ce cas pourquoi ton programme ne fonctionne-t-il pas correctement, alors qu'après que je l'ai corrigé comme expliqué par Microsoft, il fonctionne avec tes deux images ??? 🤔


dis moi que j'ai tords maintenant ;)
On voit sur tes gif que, comme d'hab, tu restes encore campé sur tes positions... 🙄

Est-ce que tu sais lire ???
Si oui,qu'est-ce qu'il y a de si compliqué pour toi à comprendre quand je te dis que tes w et h sont faux ?!?
Tant que tu continueras d'utiliser ces valeurs erronées ton programme ne fonctionnera jamais correctement.

Sérieux, je te dis que tes pourcentages sont bons mais que tes w et h sont moisis, du coup tu mets tes pourcentages en dur sans modifier tes w et h (qui restent donc toujours moisis)... et tu appelles ça une démonstration !... 😂😂😂


serieux
il n'y a pas 36 données
il y a un width et un height au départ

qu'est ce qui ne peut pas être bon dans ceci
Je te l'ai expliqué plusieurs fois dans mes messages précédents. 😉
Si tu veux bien tester un truc, essaye ceci : pour calculer w et h, prends le nombre réel de pixels respectifs de l'image et divise-les par 4/3.
Et dis-moi si ça marche mieux. 😉
 
Dernière édition:

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Je ne me la joue pas du tout, et comme je te l'ai déjà dit ce n'est pas ma science puisque ce n'est pas moi qui ai pondu la correction de ton programme mais c'est Microsoft qui donne la solution sur le lien que je t'ai donné.



Visiblement ce qui n'est pas clair pour toi malgré ma démonstration, c'est que tes w et h sont forcément faux.


Peut-être me trompé-je, mais dans ce cas pourquoi ton programme ne fonctionne-t-il pas correctement, alors qu'après que je l'ai corrigé comme expliqué par Microsoft, il fonctionne avec tes deux images ??? 🤔



Je te l'ai expliqué plusieurs fois dans mes messages précédents. 😉
Si tu veux bien tester un truc, essaye ceci : pour calculer w et h, prends le nombre réel de pixels respectifs de l'image et divise-les par 4/3.
Et dis-moi si ça marche mieux. 😉
Bsr Patrick, bonsoir TooFatBoy, le Forum :)
@TooFatBoy au lieu de jouer au chat et à la souris. Ne serait-il pas plus correct de poster le fichier qui fonctionne ?
 
Dernière édition:

Cousinhub

XLDnaute Barbatruc
Hello,
N'apportera surtout rien au fil, surtout niveau "résolution"....
Si tu veux bien tester un truc, essaye ceci : pour calculer w et h, prends le nombre réel de pixels respectifs de l'image et divise-les par 4/3.
Et dis-moi si ça marche mieux. 😉
Perso, j'aurais multiplié par 3/4....

au lieu de jourer au chat et à la souris. Ne serait-il pas plus correct de poster le fichier qui fonctionne ?
Quitte à correcter, pourquoi ne pas "nuiter"?
OK,je ->[ ]
Bonne soirée (sous vos acclamations, applaudissements, ...)
 

TooFatBoy

XLDnaute Barbatruc
Perso, j'aurais multiplié par 3/4....
Il me semble qu'on a déjà parlé de ce genre de choses avec le camarade PatrickToulon (c'était au sujet du calcul des heures), et qu'il n'aime pas quand on simplifie trop.
4/3 c'est 1,3 et 1,3 est une valeur que PatrickToulon connaît parfaitement depuis les nombreuses années qu'il travaille sur le nombre de points au niveau de l'affichage.

Donc j'ai préféré lui dire de diviser par 4/3, plutôt que de multiplier par 3/4. C'est la même chose, mais c'est moins "parlant". 😉



ps : je suis d'ailleurs assez curieux de savoir si ça marche.
 

patricktoulon

XLDnaute Barbatruc
re
donc si je comprends bien
tu me dis que w et h sont faux
donc selon toi quand j'insère une shape(une image)
en point elle n'aurait pas la dimension que le fichier image en point c'est bien ce que tu veux me dire ?
je vais contrôler ça mais c'est une première

je n'ai jamais vu une image ajouté mano mano ou par vba se redimensionner toute seule

et combien même ce serait le cas , on en revient alors au fait et là c'est pire finalement , que c'est excel qui a une limite de taille d'image j'avais donc raison depuis le début

je dis ça car le calcul est fait sur le width/height de l'image sur feuille

je vais faire un autre test pour confirmer ce point
 

Staple1600

XLDnaute Barbatruc
[n'apporte rien au fil itoo]
Ne serait-il pas plus correct de poster le fichier qui fonctionne ?
Si on parle de correction dans le sens de bienséance, ne serait-il pas correct d'avant tout laisser Excel vivre sa vie de tableur ? ;)

Pour tripatouiller autre chose que des chiffres dans Excel, il y a VSTO, Visual Studio et accessoirement PowerShell

Bonjour chez vous (comme disait un autre Patrick)

Celui qui tournait frappadingue dans le beau village de Portmeirion ;)
[n'apporte rien au fil itoo]
 

patricktoulon

XLDnaute Barbatruc
re
bon je confirme le .width et .height de la shape n'est pas bon
effectivement la taille de l'image est modifiée automatiquement
tu m'aurais dis "Patrick la taille l'ors de l'ajout de la shapes dans la feuille est modifié
et donc ramenée à un maximun de(xxxxxx points sur yyyy points )
j'aurais compris et vérifier tout de suite
pas la peine de me balader avec des romans

donc la solution que j'ai adopté
c'est
VB:
   Dim w As Single, h As Single, shap As Shape
    With ActiveSheet
        .Pictures.Insert (tbchemin)
        Set shap = .Shapes(.Shapes.Count)
        shap.CopyPicture
      shap.Delete
      .Paste
       Set shap = .Shapes(.Shapes.Count)
la première fois shap est l'original insérée la 2d c'est la copyenpicture donc au max de la taille possible des pictures
et mes calcul on les changent pas
et ça fonctionne

ça veux dire aussi que garder l’échelle d'origine est impossible avec les grandes images
 

patricktoulon

XLDnaute Barbatruc
Ben oui, c'est ce que je te dis depuis le début !

La solution donnée par Microsoft sur le lien que je t'ai donné fonctionne parfaitement mais, perso, je préfère la solution donnée par @mromain
je viens de te répondre en #28

perso je prefère WIA je travaille avec des image de 4500 par 3700 (8/10 mega l'image)et WIA ne rechigne pas
et il n'y a même pas ouverture physique du fichier

j'ai fait cette version pour un collègue au départ qui a un MAC (et MAc WIA nada!!)
 

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35