2013-02-25 66 views
12

शामिल किसी ऑब्जेक्ट को क्रमबद्ध करने के लिए मैं जावा में एक साधारण छवि संपादन प्रोग्राम बनाने की कोशिश कर रहा हूं। मैंने ImageCanvas ऑब्जेक्ट बनाया है जिसमें संपादित की जा रही छवि के बारे में सारी जानकारी है (कुछ मूल गुण, लागू होने वाले प्रभावों की सूची, BufferedImage परतों आदि की एक सूची) और मैं इसे डिस्क पर सहेजने का एक आसान तरीका चाहता था ताकि यह डिस्क पर सहेज सके बाद में खोला जा सकता है।BufferedImages

मुझे लगा कि जावा के डिफॉल्ट Serializable इंटरफ़ेस का उपयोग करके मैं वही हो सकता हूं जो मैं ढूंढ रहा था और मैं पूरी ऑब्जेक्ट को फ़ाइल में लिख सकता था और इसे बाद में फिर से स्मृति में पढ़ सकता था। हालांकि, ImageCanvas में ArrayList<BufferedImage> शामिल है, और BufferedImage क्रमबद्ध नहीं हैं (बाकी सब कुछ है)।

मैं इसे writeObject() और readObject() तरीकों ओवरराइड करने के लिए संभव है पता है, लेकिन मैं इतना कभी नहीं किया है और अगर कोई आसान तरीका जावा को क्रमानुसार सब कुछ है और पढ़ने/लिखने BufferedImage लिए कुछ कस्टम रास्ता है मैं सोच रहा था डिस्क पर है? या क्या डिस्क पर डिस्क पर पूरे ImageCanvas ऑब्जेक्ट को आसानी से लिखने का कोई और तरीका है? आखिर में मैं अपनी खुद की कस्टम छवि फ़ाइल प्रकार को कार्यान्वित कर सकता हूं, लेकिन अभी के लिए मैं परीक्षण करते समय अस्थायी रूप से फ़ाइलों को सहेजने का एक तेज़ और आसान तरीका चाहता था (ImageCanvas कक्षा बहुत बदल जाएगी, इसलिए मैं अद्यतन रखना नहीं चाहता था मेरे कस्टम फ़ाइल प्रकार से पहले इसे अंतिम रूप दिया गया है)।

उत्तर

23

अपने ArrayList<BufferedImage> क्षणिक बनाएं, और एक कस्टम writeObject() विधि लागू करें। इसमें, अपने ImageCanvas के लिए नियमित डेटा लिखें, फिर पीएनजी प्रारूप का उपयोग करके छवियों के लिए मैन्युअल रूप से बाइट डेटा लिखें।

class ImageCanvas implements Serializable { 
    transient List<BufferedImage> images; 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     out.defaultWriteObject(); 
     out.writeInt(images.size()); // how many images are serialized? 
     for (BufferedImage eachImage : images) { 
      ImageIO.write(eachImage, "png", out); // png is lossless 
     } 
    } 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
     in.defaultReadObject(); 
     final int imageCount = in.readInt(); 
     images = new ArrayList<BufferedImage>(imageCount); 
     for (int i=0; i<imageCount; i++) { 
      images.add(ImageIO.read(in)); 
     } 
    } 
} 
+0

मैं इसका उपयोग कैसे कर सकता हूं। तरीके निजी हैं। – avicennasoftwarelabs

+1

@avicennasoftwarelabs, बस लिखने को लागू करना ऑब्जेक्ट और readObject जावा ऑरियलाइजेशन को उन तरीकों का उपयोग करने के लिए बताएगा जब आपके ऑब्जेक्ट को क्रमबद्ध/deserializing, विधियां निजी हैं। –

+2

दुर्भाग्यवश छवियों में पीएनजी डिकोडर में इसमें बग है, जिसका अर्थ है कि वह डेटा जिसे आप वापस पढ़ते हैं वह आपके द्वारा लिखे गए डेटा जैसा नहीं है (रंग अक्सर 1 से बंद होते हैं) – mjaggard

0

सीरियलाइजेशन काफी सीधे आगे है कि यह स्थिर डेटा बनी हुई है। आप अन्यथा तरीकों के सीरियलाइजेशन परिवार में पढ़ने/लिखने के ऑब्जेक्ट के साथ सही जगह पर हैं। इस बारे में सोचें कि "बुफर्ड इमेज" क्या है। यह एक बफर स्ट्रीमिंग कार्यान्वयन है। क्रमबद्ध करने के लिए, डेटा को बाइट [] सरणी जैसे स्थिर ऑब्जेक्ट पर फ़्लश किया जाना चाहिए और फिर उस ऑब्जेक्ट को बुफर्ड इमेज के क्रमबद्ध/deserialized किया जा सकता है जैसे कि buffered स्ट्रीमिंग अब उस बाइट में/बाहर आती है [] सरणी।

+0

आपको बताएंगे कि कैसे यह वास्तव में मेरी स्थिति (कैसे आप एक बाइट [] में एक BufferedImage बारी है और आप ImageCanvas क्रमबद्धता के बाकी के साथ कैसे शामिल करते हैं) में किया जा होगा कुछ कोड प्रदान कर सकता है? – scaevity

+0

रचनाकारों से संबंधित BufferedImage (यदि आपको इस कक्षा का उपयोग करना चाहिए) पर विधियों का पालन करें। इससे एक WritableRaster (और अन्य डेटा) का उपयोग BufferedImage बनाने के लिए किया जा सकता है। BufferedImage एक getWritableTile (x, y) विधि है जो एक WritableRaster देता है। रास्टर क्लास, जो WritableRaster से विरासत में मिला है, में विभिन्न getPixel() विधियां हैं जो लौट सकती हैं, उदाहरण के लिए, आदिम int [] की एक सरणी। यह बहुत सरल नहीं है लेकिन प्राइमेटिव्स से वापस बुफर्ड इमेज तक पहुंचने के लिए उलट किया जा सकता है। एक अलग बेस छवि वर्ग का उपयोग करने पर विचार करें जो क्रमबद्ध/deserialize करने के लिए आसान है। –