2012-07-03 16 views
5

Jestem nowicjuszem w grafice Java (grafika komputerowa w ogóle) i Stack Overflow, więc proszę pomóżcie mi i pomóżcie mi lepiej sformułować mój problem.Obraz buforowany nie wyświetla się (cały czarny), ale może zostać wyświetlony obraz

W tej chwili próbuję wyświetlić BufferedImage obok oryginalnego obrazu w GUI Java. To jest mój kod:

Image oriImage = robot.getQwerkController().getVideoStreamService().getFrame(); //load the original image 
Graphics2D hi = bufferedImage.createGraphics(); 
hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage 
hi.dispose(); 
images[0].put(oriImage, 1); //draws the original image in the first frame 
images[1].put(bufferedImage, 2); //draws the BufferedImage in the second frame 

i "put" funkcja jest następująca:

public synchronized void put(Image image, int frameNumber) { 
    icon.setImage(image); //sets the image displayed by this icon 
    display.paintImageIcon(icon, frameNumber); //paint the image onto the gui 
    imageSet = true; 
    notifyAll(); 
} 

Jednak uzyskany GUI jest następująco

enter image description here

tak więc prace wizerunku , ale BufferedImage tego nie robi. Zakładam, że działa, ponieważ BufferedImage jest podklasą obrazu ... Każdy pomysł? Proszę dać mi znać, jeśli jest potrzebny dodatkowy kod ~ Z góry dzięki :)

EDIT 1:

Zrobiłem kilka testów, a zamiast używać oryginalnego obrazu, I stworzył zupełnie nowy BufferedImage i wykorzystywane do Graphics2D narysuj linię, a następnie spróbuj ją wyświetlić. oto wynik:

http://i.imgur.com/rJAdp.jpg

Tak to działa. Dlatego coś musi być nie tak z oryginalnym obrazem (lub konwersją, która się wydarzyła)

EDIT 2: Zrobiłem podobną rzecz z bufferedImage i narysowałem linię. Wynik jest taki sam jak EDIT 1, dlatego myślę, że istnieje pewien problem z funkcją drawImage.

EDYCJA 3: Rozwiązałem problem poprzez umieszczenie pętli wokół rysowania, aby umożliwić wykonanie rysunku (ponieważ zwraca on wartość false, jeśli nie zakończyło jeszcze rysowania obrazu) i zadziałało! : D

boolean x = false; 
while (!x) { 
    x = hi.drawImage(oriImage, 0,0, null); //draw the original image into the BufferedImage 
} 
+2

Czy możesz opublikować kod opisujący początkowo tworzenie obiektu 'bufferedImage'. – cgull

+0

'// wczytaj oryginalny obraz' Synchronicznie (czeka na załadowanie obrazu) lub asynchronicznie (kod jest kontynuowany podczas ładowania obrazu)? Aby uzyskać lepszą pomoc wcześniej, opublikuj [SSCCE] (http://sscce.org/). –

+0

Chciałbym, gdybym mógł opublikować SSCCE, problem polega na tym, że cały projekt jest dość duży i wiele kodów nie ma związku z problemem. (Obraz, który otrzymujemy teraz, pochodzi z kamery internetowej, która jest załadowana na robota). Jednak edytuję, by uzyskać więcej informacji. Dzięki! –

Odpowiedz

1

Powinieneś być w stanie osiągnąć ten sam rezultat, jeśli tylko zdać ImageObserver (The JFrame lub JPanel instancję, do której jesteś rysunku) do metody drawImage zamiast null. W ten sposób zajmiesz się ładowaniem obrazu asynchronicznego.

+0

fajne Spróbuję też. Dzięki –

0

Przepraszam, ale domyślam się, że używasz natychmiastowego malowania (push). Ogólnie java robi to na odwrót (pull).

Java swing/awt rysuje zdarzenie napędzane: jeden nie rysuje od razu obrazu, ale można go uruchomić poprzez unieważnienie lub odświeżenie. Możesz uruchomić zegar z ustawioną liczbą klatek na sekundę i wywołać odświeżenie().

Generalnie dziecko z dzieckiem JPanel może wtedy zastąpić paintComponent(Graphics g) i narysować na g.

Mimo to jest dziwne. Możesz spróbować zalogować oriImage.getHeight(null), aby zobaczyć (mało prawdopodobne), czy obraz jest tworzony asynchronicznie (wysokość -1 na początku).

+0

Yeap Zrozumiałem to po obejrzeniu dokumentacji kodu. –

Powiązane problemy