के साथ समस्याएं मैं सी ++/क्यूटी के लिए काफी नया हूं और मैं विजुअल स्टूडियो सी ++ और क्यूटी (4.8.3) के साथ एक एप्लिकेशन बनाने की कोशिश कर रहा हूं। एप्लिकेशन QGraphicsView का उपयोग कर छवियों को प्रदर्शित करता है, मुझे छवियों को पिक्सेल स्तर पर बदलने की आवश्यकता है।बड़े QImage
बुनियादी कोड (सरलीकृत) है:
QImage* img = new QImage(img_width,img_height,QImage::Format_RGB32);
while(do_some_stuff) {
img->setPixel(x,y,color);
}
QGraphicsPixmapItem* pm = new QGraphicsPixmapItem(QPixmap::fromImage(*img));
QGraphicsScene* sc = new QGraphicsScene;
sc->setSceneRect(0,0,img->width(),img->height());
sc->addItem(pm);
ui.graphicsView->setScene(sc);
यह चारों ओर 12000x6000 पिक्सेल अप करने के लिए छवियों के लिए अच्छी तरह से काम करता है। अजीब चीज इस आकार से परे होती है। जब मैं img_width=16000
और img_height=8000
सेट करता हूं, उदाहरण के लिए, रेखा img = new QImage(...)
एक शून्य छवि देता है। छवि डेटा लगभग 512,000,000 बाइट होना चाहिए, इसलिए यह 32 बिट सिस्टम पर भी बहुत बड़ा नहीं होना चाहिए। इसके अलावा, मेरी मशीन (विन 7 64 बिट, 8 जीबी रैम) डेटा रखने में सक्षम होना चाहिए।
मैं भी इस संस्करण की कोशिश की है:
uchar* imgbuf = (uchar*) malloc(img_width*img_height*4);
QImage* img = new QImage(imgbuf,img_width,img_height,QImage::Format_RGB32);
सबसे पहले, यह काम करता है। आईएमजी पॉइंटर मान्य है और img->width()
पर कॉल करना उदाहरण के लिए सही छवि चौड़ाई (0 के बजाय, छवि सूचक शून्य होने पर) देता है। लेकिन जैसे ही मैं img->setPixel()
पर कॉल करता हूं, पॉइंटर शून्य हो जाता है और img->width()
रिटर्न 0
तो मैं गलत क्या कर रहा हूं? या पिक्सेल स्तर पर बड़ी छवियों को संशोधित करने का एक बेहतर तरीका है?
सादर, डेविड
आवंटन वास्तव में काम कर रहा है या नहीं, यह देखने के लिए पहले malloc'd स्मृति को मैन्युअल रूप से शून्य करने का प्रयास करें। –
इस पर एक नज़र डालें: [क्यूटी परियोजना विकी: बड़ी छवियां लोड हो रही हैं] (http://qt-project.org/wiki/LoadingLargeImages) – dschulz
याद रखें कि 32 बिट विंडोज़ एप्लिकेशन पर डिफ़ॉल्ट सबसे बड़ा आवंटन आप परिणाम दे सकते हैं पता स्थान विखंडन/LARGEADDRESSAWARE लिंकर ध्वज और/या विखंडन को कम करने के लिए आपके एप्लिकेशन द्वारा उपयोग किए जाने वाले डीएलएस को पुन: उपयोग किए बिना 1.2 जीबी (2 जीबी एप्लिकेशन एड्रेस स्पेस का) होगा। – drescherjm