2012-01-05 4 views
1

Je viens d'apprendre comment utiliser les threads hier et j'essaye d'encoder des images en utilisant des threads, mais je vais obtenir cette erreur java.lang.IllegalArgumentException: im == null!
J'ai essayé de faire exactement la même chose sans fil et ça a bien fonctionné lentement, pas à cause de l'image mais à cause du temps qu'il faut pour encoder les images. le WinDef.HDC est un type de variable que j'ai obtenu à partir de la bibliothèque JNA. Quand je l'ai essayé sans fil, je pouvais facilement écrire 1000 images (environ 60mb).java.lang.IllegalArgumentException: im == null! erreur

//The thread class 
public class imageEncoderThread extends Thread { 

    HDC originalImage; 
    BufferedImage image; 


    public imageProcessThread (HDC rI) { 
     originalImage = rI' 
    } 

    @Override 
    public void run() { 
     //returns a buffered image 
     image = process(rawImage); 
     try { 
      ImageIO.write(image, "jpg", new File (filePath)); 
     } catch (IOException e) { 

     } 

    } 

} 


//full stack trace 
    Exception in thread "Thread-5" java.lang.IllegalArgumentException: im == null! 
     at javax.imageio.ImageIO.write(Unknown Source) 
     at javax.imageio.ImageIO.write(Unknown Source) 
     at com.capture.SingleImageEncoderThread.run(Thread.java:33) 
    Exception in thread "Thread-7" java.lang.IllegalArgumentException: im == null! 
     at javax.imageio.ImageIO.write(Unknown Source) 
     at javax.imageio.ImageIO.write(Unknown Source) 
     at com.capture.SingleImageEncoderThread.run(Thread.java:33) 
    Exception in thread "Thread-6" java.lang.IllegalArgumentException: im == null! 
     at javax.imageio.ImageIO.write(Unknown Source) 
     at javax.imageio.ImageIO.write(Unknown Source) 

//and so on with the same exception 
+1

Il semble que l'image = JNAScreenShot.encodeRawWindow (rawImage, bounds); à cette ligne l'image est nulle. Avez-vous essayé d'imprimer System.out? – kosa

+0

essayé maintenant il imprime null il semble que, pour une raison quelconque, il ne passe pas l'objet dans le fil - sur une note de côté quand j'ai vérifié l'API pour le WinDef.HDC il étend poignée ne sais pas si cela a un rapport avec il? – user4090

+0

Je ne sais pas quelle est cette méthode, dès que c'est corrigé, tout devrait bien fonctionner. – kosa

Répondre

3

Il est presque certain que vous ne pouvez pas appeler:

image = JNAScreenShot.encodeRawWindow(rawImage, bounds); 

de tout autre thread que le thread principal ui. Voir: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/6398cda5-5393-4b16-b8dc-5bbf8902033f/ (spécifiquement, je ne pense pas que les HDC sont utilisables en dehors du thread ui principal). Donc, vous devrez d'abord créer la capture d'écran, puis la passer à votre thread pour faire l'E/S (c'est probablement la partie lente, de toute façon).

+0

oui c'est juste ce que je cherchais toute la journée, tous mes bugs semblaient être liés au fait que je prenais des images (HDC) dans une minuterie fil et essayé de les traiter dans un autre – user4090

+0

sur une note de côté savez-vous ho la chose HDC fonctionne? Je viens de découvrir à ce sujet après donloawding la bibliothèque de JNA. Qu'est-ce que je suis vraiment curieux à propos de mille est où il stocke des informations et comment y accéder – user4090

+0

ne semble pas vraiment trouver quelque chose de significatif sur la classe HDC à travers google – user4090

Questions connexes