2017-07-02 4 views
2

Il ya déjà beaucoup de messages sur cette erreur, mais je n'arrive pas à trouver une solution; lors du chargement d'une image par programme (avec la fonction LoadPicture()) à un contrôle d'image sur un userform je reçois cette erreur:Charger Erreur d'image pour JPEG

Run-time error 481 - Invalid picture

et similaire

Invalid picture

un message quand il est chargé manuellement. De mes recherches sur Internet, j'ai trouvé une foule de conseils sur cette erreur; la plupart des messages ont tendance à être parce que le user is uploading a png ou autre image invalide (such as a corrupt jpg), some suggest que mon dossier temp est plein, others think un virus est la raison (je suis sceptique à propos de ce dernier).

Dans ma demande, ma photo est

  • Un jpg (qui MSDN lists as an acceptable format dans la section des remarques de leur LoadPicture() article)

  • Non corrompu (au moins, je peux la voir avec des fenêtres PhotoViewer/Chrome/Peinture fine)

  • Relativement petit (comme dans, il est ~ 1MPx et un jpeg de 200MPx j'ai testé chargé sans aucune erreur)

La seule chose un peu inhabituel est que je télécharge ce à partir du Web directement en utilisant le code suivant:

Public Declare Function URLDownloadToFile Lib "urlmon" _ 
    Alias "URLDownloadToFileA" _ 
    (ByVal pCaller As Long, _ 
    ByVal szURL As String, _ 
    ByVal szFileName As String, _ 
    ByVal dwReserved As Long, _ 
    ByVal lpfnCB As Long) As Long 'api to download files 

Sub setPicTest() 
    Dim tmpImg As MSForms.Image 'create an image control on UserForm1 at runtime 
    Set tmpImg = UserForm1.Controls.Add("Forms.Image.1") 
    tmpImg.Picture = getImg("https://s-media-cache-ak0.pinimg.com/originals/22/e2/4d/22e24d3b5703a1c1cc43df5b13f53fd2.png") 
End Sub 

Function getImg(url As String) As IPictureDisp 'loads a picture from a url 
    Dim strFile As String 'file save location 
    strFile = Environ("Temp") & "\Temp.jpg" 'save *as jpeg* in %temp% folder 
    Debug.Print URLDownloadToFile(0, url, strFile, 0, 0) 'download file to temp folder 
    Set getImg = LoadPicture(strFile) 'load image -error- 
    Kill strFile 'clean up temp file 
End Function 

Alors que je travers, tout se passe comme prévu

  • Un vide (aucune image) le contrôle d'image apparaît sur mon UserForm
  • Un fichier appelé temp.jpg apparaît dans mon dossier temporaire
    • Ce fichier ne semble pas être corrompu

Mais les pauses d'exécution de code sur l'erreur. Ceci est particulièrement surprenant car le code fonctionne correctement pour les petites images miniatures, c'est juste que ces images en pleine résolution ne semblent pas fonctionner.

+1

C'est un fichier png. Le renommer en jpg n'aidera pas :) –

Répondre

4

C'est un fichier png. Le renommer en jpg n'aidera pas. URLDownloadToFile télécharge un fichier. Cela ne change pas le type de fichier.

Cela dit ici est une façon d'obtenir ce que vous voulez;)

Logic:

  1. Insérez une feuille de calcul de température
  2. Insérez l'image directement dans la feuille de calcul
  3. Insérer a
  4. Copiez l'image dans le graphique et exportez-la sous la forme .Jpg
  5. Chargement de l'image à l'aide de LoadPicture
  6. Supprimez les objets et le fichier temporaire que nous avons créés.

code

Sub setPicTest() 
    Dim wsTemp As Worksheet 
    Dim tmpImg As MSForms.Image 
    Dim PicPath As String, tmpPath As String 
    Dim oCht As Chart 

    Set tmpImg = UserForm1.Controls.Add("Forms.Image.1") 

    Set wsTemp = ThisWorkbook.Sheets.Add 

    '~~> This is the .PNG image 
    PicPath = "https://s-media-cache-ak0.pinimg.com/originals/22/e2/4d/22e24d3b5703a1c1cc43df5b13f53fd2.png" 
    '~~> This will be the .JPG image 
    tmpPath = Environ("Temp") & "\Temp.jpg" 

    With wsTemp 
     .Pictures.Insert(PicPath).ShapeRange.LockAspectRatio = msoTrue 
     DoEvents 
     Set oCht = Charts.Add 
     .Shapes(1).CopyPicture xlScreen, xlBitmap 

     With oCht 
      .Paste 
      .Export Filename:=tmpPath, Filtername:="JPG" 
     End With 
     DoEvents 

     tmpImg.Picture = LoadPicture(tmpPath) 

     '~~> Clean Up 
     On Error Resume Next 
     Application.DisplayAlerts = False 
     .Delete 
     oCht.Delete 
     Application.DisplayAlerts = True 
     On Error GoTo 0 
    End With 

    '~~> Delete the temp image 
    Kill tmpPath 
End Sub 

EDIT

Pour des fins d'essai, j'utiliser ces paramètres

Set tmpImg = UserForm1.Controls.Add("Forms.Image.1") 

With tmpImg 
    .Left = 20  '~~> This property does not shown in Intellisense 
    .Width = 300  '~~> This property does not shown in Intellisense 
    .Height = 300  '~~> This property does not shown in Intellisense 
    .Top = 10   '~~> This property does not shown in Intellisense 

    .PictureAlignment = fmPictureAlignmentCenter 
    .PictureSizeMode = fmPictureSizeModeStretch 
End With 

Screenshot

![enter image description here

+0

C'est une méthode beaucoup plus simple (ou du moins plus facile à suivre) que certaines approches [API] (http://www.vbforums.com/showthread.php?582741-RESOLVED- Code minimum pour dessiner-PNG-GDI & p = 3598346 # post3598346) J'ai vu. Je vois où je me suis trompé, je suppose que j'essayais d'éviter d'utiliser autre chose que LoadPicture() ', et j'ai juste supposé que parce que le fichier * affiché *, il avait été converti avec succès en jpg (pas seulement * renommé *). J'ai aussi trouvé une méthode légèrement plus simple (mais moins compatible/peut-être des temps d'exécution plus longs que les vôtres) – Greedo

0

Comme @Siddharth Rout souligne, même si l'explorateur Windows du fichier téléchargé ressemble à un jpeg, il était en effet encore .png qui est ce qui a causé l'erreur. Croyez-moi quand je dis que mon code réel était beaucoup moins clair que ce que j'ai posté ici et donc l'extension png du fichier était caché et beaucoup plus difficile à repérer!

De toute façon, il fournit une réponse pour obtenir le png dans un contrôle d'image. Une autre option que je vais avec serait:

Function getImg(url As String) As IPictureDisp 'loads a picture from a url 
    Dim strFile As String 'file save location 
    strFile = Environ("Temp") & "\Temp.png" 'save with more extensions like png in %temp% folder 
    Debug.Print URLDownloadToFile(0, url, strFile, 0, 0) 'download file to temp folder 
    With New WIA.ImageFile 
     .LoadFile strFile 
     Set getImgPng = .FileData.Picture 'return same thing as LoadPicture() would 
    End With 
    Kill strFile 'clean up temp file 
End Function 

L'objet WIA.ImageFile nécessite une référence à la Microsoft Windows Image Acquisition Library v2.0 qui est disponible dans Windows Vista ou plus récent.