2012-04-20 36 views
19

Tôi đang cố gắng gửi nhiều hình ảnh qua ổ cắm bằng java nhưng tôi cần một cách nhanh hơn để chuyển đổi hình ảnh thành mảng byte để tôi có thể gửi chúng. Tôi đã thử đoạn mã sau nhưng nó đã viết khoảng 10.000 hình ảnh vào ổ C: \ của tôi. Có cách nào để thực hiện chuyển đổi này mà không cần ghi vào đĩa không? Cảm ơn!Java- Chuyển đổi bufferedimage thành byte [] mà không cần ghi vào đĩa

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

        //ImageIO.setUseCache(false); 
        ImageIO.write(bi.getImage(), "jpg", outputStream); 

        byte[] imageBytes = outputStream.toByteArray(); 
+0

Lưu ý rằng thêm một ít thời gian làm nén hình ảnh bằng cách sử dụng nén cao hơn (chất lượng thấp) JPEG có thể tiết kiệm rất nhiều thời gian mạng. Tôi nghĩ rằng bạn cần phải xem xét kích thước byte thực sự được gửi, mà sẽ lớn hơn đáng kể với một 'BufferedImage' thuần túy. BTW - nguồn gốc của những hình ảnh này là gì? Nếu đó là ảnh chụp màn hình ví dụ: thường PNG có thể cung cấp kích thước byte nhỏ hơn JPEG nén mặc định. Nếu đó là ảnh chụp màn hình liên tục, có lẽ ngay cả một luồng video. –

+0

Nguồn là ảnh chụp màn hình liên tục mà tôi chủ yếu tạo thành một luồng. Nhưng có, tôi cần phải tìm ra cách để nén các hình ảnh mà không cần ghi chúng vào đĩa. Đó là mục tiêu tối thượng của tôi – tier1

Trả lời

38

này nên làm việc:

byte[] imageBytes = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData(); 
+0

Bạn là một người tiết kiệm cuộc sống. Cảm ơn! – tier1

+14

Thao tác này sẽ tạo bản sao của hình ảnh. Nếu bạn chỉ muốn tham chiếu trực tiếp đến các byte, hãy gọi bufferedImage.getRaster(). GetDataBuffer() và cast nó cho phù hợp (không phải lúc nào cũng an toàn để truyền vào một DataBufferByte) –

+3

điều này dường như không có tác dụng với tôi. Tôi nhận được 'java.awt.image.DataBufferInt không thể được đưa vào java.awt.image.DataBufferByte' bufferedimage của tôi là đến từ một' Robot.createScreenCapture() 'không chắc chắn rằng vấn đề – user3712476

-2

Sử dụng Apache Commons IO Utils Apache Commons

IOUtils.copy (InputStream, OutputStream);

IO Utils API hỗ trợ các bộ đệm lớn một cách dễ dàng

1

Thử sử dụng:

ImageIO.setUseCache(false); 

Trước khi viết, có lẽ đó sẽ giúp.

+0

Tôi đã thử điều này, tuy nhiên, tôi tin rằng điều này vẫn ghi vào đĩa, nó chỉ xóa nó sau khi hoạt động hoàn tất. – tier1

+0

không nên, ít nhất là theo tài liệu: 'Đặt cờ này thành false sẽ không cho phép sử dụng đĩa cho các luồng trong tương lai, điều này có thể thuận lợi khi làm việc với các hình ảnh nhỏ, vì chi phí tạo và hủy tệp bị xóa.'. Có lẽ chương trình của bạn ghi vào đĩa ở một nơi khác? – soulcheck

+0

Vâng, tôi thấy rằng trong tài liệu là tốt. Dù bằng cách nào, các hoạt động là đau đớn chậm cho những gì tôi đang tìm kiếm để làm. Cảm ơn mặc dù. – tier1

1
BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes)); 
byte[] bytes = new byte[buf.capacity()]; 
buf.get(bytes, 0, bytes.length); 
0

Mã dưới nó là rất nhanh (vài mili giây)

import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 

public byte[] toByteArray(BufferedImage image) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();    
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); 
    encoder.encode(image);    
    return baos.toByteArray(); 
} 
+3

Tốt hơn là nên tránh xa gói com.sun. –

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