2010-11-20 8 views
9

मैं कच्चे नमूनों से BufferedImage प्राप्त करने का प्रयास कर रहा हूं, लेकिन मुझे उपलब्ध डेटा सीमा से पहले पढ़ने की कोशिश करने के बारे में अपवाद मिलते हैं जिन्हें मैं समझ नहीं पा रहा हूं। मुझे क्या करना कोशिश कर रहा हूँ है:कच्चे डेटा से BufferedImage कैसे बनाएं

val datasize = image.width * image.height 
val imgbytes = image.data.getIntArray(0, datasize) 
val datamodel = new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT, image.width, image.height, Array(image.red_mask.intValue, image.green_mask.intValue, image.blue_mask.intValue)) 
val buffer = datamodel.createDataBuffer 
val raster = Raster.createRaster(datamodel, buffer, new Point(0,0)) 
datamodel.setPixels(0, 0, image.width, image.height, imgbytes, buffer) 
val newimage = new BufferedImage(image.width, image.height, BufferedImage.TYPE_INT_RGB) 
newimage.setData(raster) 

दुर्भाग्य से मैं मिलता है:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 32784 
    at java.awt.image.SinglePixelPackedSampleModel.setPixels(SinglePixelPackedSampleModel.java:689) 
    at screenplayer.Main$.ximage_to_swt(Main.scala:40) 
    at screenplayer.Main$.main(Main.scala:31) 
    at screenplayer.Main.main(Main.scala) 

डेटा है मानक आरजीबी 1 बाइट गद्दी के साथ (ताकि 1 पिक्सेल == 4 बाइट्स) और छवि का आकार 1366x24 पीएक्स है।


मुझे अंततः नीचे दिए गए सुझाव के साथ चलाने के लिए कोड मिला। अंतिम कोड है:

val datasize = image.width * image.height 
val imgbytes = image.data.getIntArray(0, datasize) 

val raster = Raster.createPackedRaster(DataBuffer.TYPE_INT, image.width, image.height, 3, 8, null) 
raster.setDataElements(0, 0, image.width, image.height, imgbytes) 

val newimage = new BufferedImage(image.width, image.height, BufferedImage.TYPE_INT_RGB) 
newimage.setData(raster) 

यह सुधार किया जा सकता है, तो मैं निश्चित रूप से सुझाव के लिए खुले हूँ, लेकिन सामान्य रूप में यह अपेक्षा के अनुरूप काम करता है।

उत्तर

10

setPixels मानता है कि छवि डेटा पैक नहीं है। तो यह लंबाई image.width * image.height * 3 का इनपुट ढूंढ रहा है, और सरणी के अंत को बंद कर रहा है।

समस्या को ठीक करने के लिए यहां तीन विकल्प दिए गए हैं।

(1) imgbytes अनपैक करें तो यह 3x लंबा है, और इसे ऊपर जैसा ही करें।

(2) मैन्युअल बजाय setPixels का उपयोग करने का imgbytes से बफर लोड:

var i=0 
while (i < imgbytes.length) { 
    buffer.setElem(i, imgbytes(i)) 
    i += 1 
} 

(3) createDataBuffer उपयोग न करें; यदि आप पहले से ही पता अपने डेटा उचित स्वरूपण है कि आप उचित बफर खुद बना सकते हैं (इस मामले में एक DataBufferInt):

val buffer = new DataBufferInt(imgbytes, imgbytes.length) 

(आप imgbytes.clone क्या करने की जरूरत हो सकती है यदि आपके मूल प्रति कुछ से उत्परिवर्तित हो सकता है अन्य)।

+0

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

+0

यदि आप कोड प्रदान कर सकते हैं जो आपके उदाहरण में 'छवि' बनाता है, तो सुनिश्चित करें। या यदि आपको परवाह नहीं है कि डेटा कैसे आता है, तो मैं एक उदाहरण बनाउंगा जो किसी छवि से नहीं है। –

+0

यह एक कस्टम ऑब्जेक्ट है जो मैं सीधे एक्सर्ग से मिलता हूं। यदि आप इसे 'ऊंचाई', 'चौड़ाई' और 4 बाइट घटकों (आरजीबी ऑर्डर + 1byte पैडिंग), या प्रत्येक पिक्सेल प्रति सिंगल इंट (समान प्रारूप) के सरणी के साथ कर सकते हैं, तो मैं बाकी को समझ सकता हूं। जिस भाग में मैं असफल हूं वह शायद बफर <-> रास्टर इंटरैक्शन है (मुझे यह भी सुनिश्चित नहीं है कि दोनों की आवश्यकता है)। बहुत बहुत धन्यवाद। – viraptor

संबंधित मुद्दे