2009-07-28 48 views
6

Tôi có ứng dụng C++ giao tiếp với máy ảnh và tìm nạp dữ liệu hình ảnh thô. Tôi sau đó có một Byte [] trong C++, mà tôi muốn gửi đến Java với JNI.Cách tạo tệp BMP từ byte thô [] trong Java

Tuy nhiên, tôi cần chuyển đổi Byte thô [] thành định dạng tệp thực (.bmp là lựa chọn đầu tiên của tôi). Tôi có thể dễ dàng làm điều này nếu tôi viết nó từ C++ vào một tập tin trên ổ đĩa cứng, bằng cách sử dụng BITMAPFILEINFO và BITMAPHEADERINFO, nhưng tôi không biết làm thế nào người ta sẽ gửi về toàn bộ định dạng cho Java. Sau đó tôi nghĩ về việc gửi dữ liệu byte thô [] bằng cách sử dụng JNI và sau đó chuyển đổi nó thành .bmp, nhưng tôi dường như không thể tìm thấy bất kỳ thư viện nào tốt để làm điều này trong Java.

Điều gì sẽ là lựa chọn tốt nhất của tôi? Chuyển đổi hình ảnh trong C++ và sau đó gửi nó bằng cách sử dụng JNI hoặc gửi dữ liệu RAW sang Java và sau đó chuyển đổi nó sang .bmp? Làm thế nào tôi sẽ đạt được điều này dễ dàng nhất?

Trả lời

6

Nó chỉ là hai dòng trong Java 1.5:

BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray)); 
ImageIO.write(image, "BMP", new File("filename.bmp")); 

Java (trên Windows) biết làm thế nào để xuất khẩu jpg, png và bmp như xa như tôi biết.

+1

Giải pháp này không hiệu quả đối với tôi. hình ảnh luôn được trả về dưới dạng null. Vì vậy, ImageIO.write ném ngoại lệ. Mảng byte của tôi là dữ liệu hình ảnh Y thô. Bạn có thể xây dựng thêm? –

+0

Bạn có chắc chắn rằng byteArray của bạn là một hình ảnh hợp lệ không? Tôi nghĩ cách duy nhất để có được 'image == null' là nếu không có đăng ký ImageReader nào có thể giải mã luồng của bạn. Vì vậy, tôi đoán là đó là một loại tệp không được hỗ trợ hoặc dữ liệu bị hỏng. – Stroboskop

+0

Dữ liệu hình ảnh YUV của nó với tỷ lệ 4: 0: 0. –

4

Không cần phải làm gì trong số đó. Biến mảng byte thành InputStream và nạp nó vào ImageIO.read();

public Image getImageFromByteArray(byte[] byteArray){ 
    InputStream is = new ByteArrayInputStream(byteArray); 
    return ImageIO.read(is); 
} 

Điều này tạo ra một đối tượng Hình ảnh từ mảng byte của bạn, sau đó rất tầm thường để hiển thị bên trong thành phần gui. Nếu bạn muốn lưu nó, bạn có thể sử dụng lớp ImageIO cho điều đó.

public void saveImage(Image img, String fileFormat, File f){ 
    ImageIO.write(img, fileFormat, f); 
} 
+0

Bạn có chắc chắn điều này sẽ hoạt động không? ImageIO sẽ biết định dạng của các pixel được lưu trữ trong mảng byte như thế nào? –

+1

vì nó kiểm tra tiêu đề tệp như bất kỳ công cụ đồ họa nào khác. – Stroboskop

+0

Nếu những gì bạn có là bộ đệm RGB thuần túy, bạn có thể xem tài liệu về BufferedImage.setRGB() –

1

Nếu bạn biết cách viết như .bmp vào một tệp, sau đó bạn có thể sử dụng (gần như) cùng một mã để viết vào bộ nhớ đệm thay thế. Bộ nhớ đệm mà bạn có thể chuyển sang Java và giải mã định dạng như Stroboskop hoặc Markus Koivisto đã đề cập. Nếu bạn đã chỉnh sửa câu hỏi của mình để bao gồm cách bạn ghi dữ liệu vào tệp .bmp, tôi có thể đề xuất cách chuyển đổi dữ liệu đó thành hoạt động trong bộ nhớ.