2009-03-16 34 views
35

Làm cách nào để lấy InputStream từ đối tượng BufferedImage? Tôi cố gắng này, nhưng ImageIO.createImageInputStream() luôn trả về NULLCách lấy InputStream từ BufferedImage?

BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300); 
ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage); 

Các hình ảnh thu nhỏ được tạo ra một cách chính xác kể từ khi tôi có thể vẽ bigImage đến một JPanel với thành công.

Cảm ơn bạn.

Trả lời

10

Nếu bạn đang cố gắng để lưu các hình ảnh vào một tập tin thử:

ImageIO.write(thumb, "jpeg", new File(....)); 

Nếu bạn chỉ muốn hiển thị ở byte thử làm cuộc gọi ghi nhưng vượt qua nó một ByteArrayOutputStream mà sau đó bạn có thể lấy mảng byte ra và làm với nó những gì bạn muốn.

+1

Cảm ơn, hãy viết thư cho ByteArrayOutputStream và sau đó chuyển đổi nó thành ByteArrayInputStream đã thực hiện công việc. Nhưng tôi tự hỏi tại sao ImageIO.createImageInputStream() không hoạt động. – fromvega

+0

Có vẻ như điều đó hy vọng đối tượng được truyền vào là một Tệp (hoặc có lẽ là những thứ khác). Tôi đã không được sử dụng API trước ... và không chắc chắn những gì nó là bạn đang cố gắng để làm :-) (xem xét nó một may mắn trên một phần của tôi rằng những gì tôi đã cho bạn làm việc :-) – TofuBeer

+0

Tôi đang cố gắng để tải lên hình ảnh đến một máy chủ, đó là lý do tại sao tôi muốn tạo một InputStream từ nó. – fromvega

72

Từ http://usna86-techbits.blogspot.com/2010/01/inputstream-from-url-bufferedimage.html

Nó hoạt động rất tốt!

Đây là cách bạn có thể làm cho một InputStream cho một BufferedImage:

URL url = new URL("http://www.google.com/intl/en_ALL/images/logo.gif"); 
BufferedImage image = ImageIO.read(url); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(image, "gif", os); 
InputStream is = new ByteArrayInputStream(os.toByteArray()); 
+2

đã làm việc cho tôi correctlt :) cảm ơn bạn. –

+0

Felipe. Tôi đã cố gắng để tìm loại (gif, png, jpg, vv) của một hình ảnh đến từ một URL mà không có phần mở rộng. Tôi tìm thấy một công việc xung quanh cho nó, nhưng khi bạn viết hình ảnh vào một dòng đầu vào ImageIO.write (hình ảnh, 'gif', os); bạn đã đề cập đến loại hình ảnh, làm cách nào tôi có thể làm điều đó mà không chỉ định loại hình ảnh. – WowBow

+0

Bạn phải chỉ định một loại. Tôi đoán nó shoulnd't được giống như đầu vào. Bạn có thể đọc từ một PNG và viết trên một JPEG. –

9

Bằng cách ghi đè các phương pháp toByteArray(), trả lại buf bản thân (không sao chép), bạn có thể tránh các vấn đề bộ nhớ liên quan. Điều này sẽ chia sẻ cùng một mảng, không tạo ra một mảng khác có kích thước chính xác. Điều quan trọng là sử dụng phương thức size() để kiểm soát số byte hợp lệ vào mảng.

final ByteArrayOutputStream output = new ByteArrayOutputStream() { 
    @Override 
    public synchronized byte[] toByteArray() { 
     return this.buf; 
    } 
}; 
ImageIO.write(image, "png", output); 
return new ByteArrayInputStream(output.toByteArray(), 0, output.size()); 
+0

Thực hiện điều này và sử dụng 'IOUtils.copy (là, output)' kết quả 'buf' có kích thước gấp đôi. Vì vậy, nó có vẻ là một cách tiếp cận rất xấu. Tôi nên downvote nhưng tôi không thể nữa. – Davidea

Các vấn đề liên quan