2012-07-03 22 views
5

Tôi mới dùng đồ họa Java (đồ họa máy tính nói chung) và Stack Overflow, vì vậy hãy giúp tôi và giúp tôi giải đáp tốt hơn.BufferedImage không hiển thị (tất cả màu đen) nhưng Hình ảnh có thể được hiển thị

Hiện tại, tôi đang cố hiển thị BufferedImage cùng với hình ảnh gốc trong GUI Java. Đây là mã của tôi:

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 

và "đặt" hàm được như sau:

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(); 
} 

Tuy nhiên, giao diện kết quả được như sau

enter image description here

Vì vậy, các tác phẩm ảnh , nhưng BufferedImage thì không. Tôi giả sử nó hoạt động vì BufferedImage là một phân lớp của hình ảnh ... Bất kỳ ý tưởng? Xin vui lòng cho tôi biết nếu mã bổ sung là cần thiết ~ Cảm ơn trước :)

EDIT 1:

tôi đã làm một số thử nghiệm, và thay vì sử dụng hình ảnh ban đầu, tôi đã tạo ra một BufferedImage hoàn toàn mới, và sử dụng Graphics2D để vẽ một đường rồi thử và hiển thị nó. đây là kết quả:

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

Vì vậy, nó hoạt động. Do đó phải có điều gì đó sai với hình ảnh gốc (hoặc chuyển đổi đã xảy ra)

EDIT 2: Tôi đã làm một điều tương tự với bufferedImage và vẽ một đường. Kết quả là giống như EDIT 1, và do đó tôi nghĩ rằng có một số vấn đề với chức năng drawImage.

EDIT 3: Tôi đã khắc phục sự cố bằng cách đặt một vòng lặp xung quanh drawImage để cho phép hoàn thành bản vẽ hình ảnh (vì nó trả về false nếu chưa hoàn thành vẽ hình ảnh) và hoạt động! : D

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

Bạn có thể vui lòng đăng mã cho cách ban đầu bạn tạo đối tượng 'bufferedImage'. – cgull

+0

'// tải hình ảnh gốc' Đồng bộ (chờ cho đến khi tải hình ảnh) hoặc không đồng bộ (mã tiếp tục khi tải hình ảnh)? Để được trợ giúp tốt hơn sớm hơn, hãy đăng một [SSCCE] (http://sscce.org/). –

+0

Tôi sẽ nếu tôi có thể đăng SSCCE, vấn đề là toàn bộ dự án là khá lớn và rất nhiều mã không liên quan đến vấn đề này. (Hình ảnh chúng tôi đang nhận được từ một webcam được tải trên rô bốt) Tuy nhiên, tôi sẽ chỉnh sửa để biết thêm thông tin. Cảm ơn! –

Trả lời

1

Bạn sẽ có thể đạt được kết quả tương tự nếu bạn chỉ vượt qua ImageObserver (các JFrame hoặc JPanel dụ vào mà bạn đang vẽ) vào phương pháp drawImage thay vì null. Điều này sau đó sẽ chăm sóc tải hình ảnh không đồng bộ cho bạn.

+0

Tôi cũng sẽ thử. Cảm ơn –

0

Xin lỗi, nhưng tôi đoán bạn đang sử dụng vẽ ngay lập tức (đẩy). Nói chung java hiện nó theo cách khác xung quanh (kéo).

Java swing/awt draws sự kiện được điều khiển: một người không vẽ hình ảnh ngay lập tức, nhưng người ta có thể kích hoạt hình ảnh đó bằng cách làm mất hiệu lực hoặc sơn lại. Bạn có thể bắt đầu một Timer Swing với tốc độ khung hình của bạn và gọi có repaint().

Nói chung, trẻ em JPanel sau đó có thể ghi đè paintComponent(Graphics g) và vẽ trên g.

Tuy nhiên điều đó thật lạ. Bạn có thể thử đăng nhập oriImage.getHeight(null), để xem (không chắc) cho dù hình ảnh được sản xuất asynchroneously (chiều cao -1 ở đầu).

+0

Yeap Tôi nhận ra điều này sau khi xem tài liệu mã. –