2012-01-05 2 views
1

Я только что научился использовать потоки вчера, и я пытаюсь кодировать некоторые изображения с помощью потоков, но я получу эту ошибку java.lang.IllegalArgumentException: im == null!
Я пробовал делать то же самое без потоков, и он работал нормально, только медленно, а не из-за изображения io, но из-за времени, которое требуется для кодирования изображений. WinDef.HDC - это переменный тип, который я получил из библиотеки JNA. Когда я попробовал это без потоков, я мог легко записать 1000 изображений (около 60 мб).java.lang.IllegalArgumentException: im == null! error

//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

Кажется, изображение = JNAScreenShot.encodeRawWindow (rawImage, bounds); на этой строке изображение равно null. Вы пытались распечатать System.out? – kosa

+0

попробовал это только сейчас, он распечатывает нуль, кажется, что по какой-то причине он не пропускает объект в поток - на стороне заметки, когда я проверил api для WinDef.HDC, он расширяет дескриптор, не уверен, что это имеет какое-либо отношение к Это? – user4090

+0

Я не знаю, что это за метод, как только он исправлен, все должно работать нормально. – kosa

ответ

3

Это почти наверняка так, что вы не можете позвонить:

image = JNAScreenShot.encodeRawWindow(rawImage, bounds); 

из любого другого потока, чем основной поток пользовательского интерфейса. См.: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/6398cda5-5393-4b16-b8dc-5bbf8902033f/ (в частности, я не думаю, что HDC можно использовать вне основной нити ui).

Итак, сначала нужно создать снимок экрана, а затем передать его в поток, чтобы сделать IO (это, вероятно, медленная часть, во всяком случае).

+0

да это просто то, что я искал весь день, все мои ошибки, похоже, были связаны с тем, что я взял изображения (HDC) в таймере нить и попытался обработать их в другом – user4090

+0

на боковой ноте вы знаете, что работает HDC? Я только что узнал об этом после того, как добрался до библиотеки. Что им действительно любопытно в тысячах, где он хранит информацию и как ее угадать – user4090

+0

не может найти что-либо значимое в классе HDC через google – user4090

Смежные вопросы