2012-04-20 12 views
19

मैं जावा का उपयोग करके सॉकेट पर एकाधिक छवियां भेजने की कोशिश कर रहा हूं लेकिन मुझे छवियों को बाइट सरणी में बदलने के लिए एक तेज़ तरीका चाहिए ताकि मैं उन्हें भेज सकूं। मैंने निम्नलिखित कोड की कोशिश की लेकिन उसने मेरे सी: \ ड्राइव में लगभग 10,000 छवियां लिखीं। डिस्क पर लिखने के बिना इस रूपांतरण को बनाने का कोई तरीका है? धन्यवाद!जावा- bufferedimage को बाइट में परिवर्तित करें [] डिस्क पर लिखने के बिना

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

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

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

ध्यान दें कि एक छोटे से अतिरिक्त समय एक उच्च संपीड़न का उपयोग कर छवि संपीड़न कर (कम गुणवत्ता) जेपीईजी नेटवर्क बहुत समय बचा सकते हैं। मुझे लगता है कि आपको वास्तव में बाइट आकार को वास्तव में भेजा जाना चाहिए, जो शुद्ध 'बुफर्ड इमेज' के साथ काफी बड़ा होगा। बीटीडब्ल्यू - इन छवियों का स्रोत क्या है? यदि यह उदाहरण के लिए स्क्रीनशॉट है, तो अक्सर पीएनजी डिफ़ॉल्ट संपीड़न जेपीईजी की तुलना में एक छोटे बाइट आकार प्रदान कर सकता है। यदि यह लगातार स्क्रीनशॉट थे, शायद एक वीडियो स्ट्रीम भी। –

+0

स्रोत निरंतर स्क्रीनशॉट है जो मैं अनिवार्य रूप से स्ट्रीम में बना रहा हूं। लेकिन हां, मुझे यह पता लगाने की जरूरत है कि उन्हें डिस्क पर लिखे बिना छवियों को कैसे संपीड़ित किया जाए। यह मेरा अंतिम लक्ष्य – tier1

उत्तर

38

यह काम करना चाहिए:

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

आपका जीवन बचतकर्ता है। धन्यवाद! – tier1

+14

यह छवि की एक प्रति बना देगा। यदि आप बाइट्स के लिए सीधे संदर्भ चाहते हैं, तो bufferedImage.getRaster()। GetDataBuffer() पर कॉल करें और तदनुसार इसे कास्ट करें (डेटाबफरबाइट पर डालना हमेशा सुरक्षित नहीं है) –

+3

यह मेरे लिए काम नहीं कर रहा है। मुझे 'java.awt.image.DataBufferInt java.awt.image.DataBufferByte' पर नहीं डाला जा सकता है, मेरी bufferedimage 'Robot.createScreenCapture()' से आ रही है, यह सुनिश्चित नहीं है कि – user3712476

-2

उपयोग अपाचे कॉमन्स आईओ Utils Apache Commons

IOUtils.copy (InputStream, outputStream); मदद करता है कि

ImageIO.setUseCache(false); 

लेखन से पहले, शायद:

IO Utils API बड़े बफ़र्स का समर्थन करता है आसानी से

1

का उपयोग करें।

+0

मैंने कोशिश की, हालांकि, मेरा मानना ​​है कि यह अभी भी डिस्क पर लिखता है, यह ऑपरेशन पूरा होने के बाद इसे हटा देता है। – tier1

+0

यह कम से कम दस्तावेज़ों के अनुसार नहीं होना चाहिए: 'इस झंडे को झूठ में सेट करना भविष्य की धाराओं के लिए डिस्क के उपयोग को अस्वीकार करता है, जो छोटी छवियों के साथ काम करते समय फायदेमंद हो सकता है, क्योंकि फ़ाइलों को बनाने और नष्ट करने के ऊपरी हिस्से को हटा दिया जाता है।' शायद आपका प्रोग्राम डिस्क पर कहीं और लिखता है? – soulcheck

+0

हाँ, मैंने देखा कि दस्तावेज़ों में भी। किसी भी तरह से, ऑपरेशन दर्दनाक रूप से धीमा है जो मैं करना चाहता हूं। हालांकि धन्यवाद। – tier1

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

कोड के नीचे यह वास्तव में तेजी से (कुछ मिलीसेकंड) है

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

com.sun पैकेज से दूर रहना बेहतर है। –