2010-01-16 4 views
14

में एक छवि फ़ाइल पढ़ना मुझे सी/सी ++ में एक छवि फ़ाइल पढ़ने की जरूरत है। यह बहुत अच्छा होगा, अगर कोई मेरे लिए कोड पोस्ट कर सकता है।सी/सी ++

मैं ग्रे पैमाने छवियों पर काम करते हैं और छवियों जेपीईजी हैं। मैं छवियों को एक 2 डी सरणी में पढ़ना चाहता हूं जो मेरे काम को आसान बना देगा।

अग्रिम

+0

libjpeg के लिए दस्तावेज़ है (http://www.ijg.org/) या जो कुछ भी देशी एपीआई आप अपर्याप्त है लिखने के लिए ? – greyfade

+1

आपके द्वारा पूछे गए तीन प्रश्नों के लिए सही उत्तर चुनना न भूलें। – mwcz

उत्तर

2

धन्यवाद CImg पुस्तकालय बाहर की कोशिश करो। tutorial आपको परिचित होने में मदद करेगा। एक बार आपके पास सीआईएमजी ऑब्जेक्ट हो जाने पर, data() फ़ंक्शन आपको 2 डी पिक्सेल बफर सरणी तक पहुंच प्रदान करेगा।

+0

वास्तव में यह एक 4D पिक्सेल मैट्रिक्स के रूप में मॉडलिंग की है, हालांकि एक 2D ग्रेस्केल छवि गहराई और रंग आयाम हुड यह टेम्पलेट प्रकार टी – jiggunjer

+0

की एक -1 डी सरणी मेरा मानना ​​है कि CImg jpegs लोड करने के लिए libjpeg की आवश्यकता है के तहत 1. करने के लिए सेट करना होगा है। –

12

आप JPEG format को देखकर अपनी खुद लिख सकते हैं।

कहा कि, CImg, या Boost's GIL की तरह एक पूर्व मौजूदा पुस्तकालय का प्रयास करें। या कड़ाई से जेपीईजी के लिए, libjpeg। CodeProject पर CxImage कक्षा भी है।

यहाँ एक big list है।

+1

बूस्ट.जीआईएल काम नहीं करता है और इसे बनाए रखा नहीं जा रहा है। – Tronic

+1

चूंकि सी की अनुमति है, मैं सबसे हल्का समाधान के रूप में दूसरा libjpeg। सीआईएमजी और जीआईएल निश्चित रूप से आसान वाक्यविन्यास-वार हैं - लेकिन libjpeg की भी आवश्यकता है। आप डेटा को सीआईएमजी ऑब्जेक्ट से कुछ एसटीएल कंटेनर या सरणी में कॉपी कर सकते हैं। – jiggunjer

+0

सीआईएमजी एक एलजीपीएल-जैसे लाइसेंस का भी उपयोग करता है जो libjpeg के बीएसडी-जैसे लाइसेंस से काफी अधिक प्रतिबंधित है। – TypeIA

2

corona अच्छा है। ट्यूटोरियल से:

corona::Image* image = corona::OpenImage("img.jpg", corona::PF_R8G8B8A8); 
if (!image) { 
    // error! 
} 

int width = image->getWidth(); 
int height = image->getHeight(); 
void* pixels = image->getPixels(); 

// we're guaranteed that the first eight bits of every pixel is red, 
// the next eight bits is green, and so on... 
typedef unsigned char byte; 
byte* p = (byte*)pixels; 
for (int i = 0; i < width * height; ++i) { 
    byte red = *p++; 
    byte green = *p++; 
    byte blue = *p++; 
    byte alpha = *p++; 
} 

पिक्सल एक एक आयामी सरणी होगा, लेकिन आप आसानी से एक 1 डी सरणी में एक पद के लिए किसी दिए गए x और y स्थिति परिवर्तित कर सकते हैं। स्थिति = (y * चौड़ाई) की तरह कुछ + x

3

बाहर चेक इंटेल ओपन सीवी पुस्तकालय ...

5

यदि आप libpng/libjpeg निर्भरताओं के बिना न्यूनतम दृष्टिकोण के लिए जाने का निर्णय लेते हैं, तो मैं stb_image और stb_image_write का उपयोग करने का सुझाव देता हूं, here मिला।

यह के रूप में यह हो जाता है के रूप में आसान है, तुम सिर्फ हेडर फाइल stb_image.h और stb_image_write.h अपने फ़ोल्डर में डालना होगा।

यहाँ कोड है कि आप छवियों पढ़ने की जरूरत है:

#include <stdint.h> 

#define STB_IMAGE_IMPLEMENTATION 
#include "stb_image.h" 

int main() { 
    int width, height, bpp; 

    uint8_t* rgb_image = stbi_load("image.png", &width, &height, &bpp, 3); 

    stbi_image_free(rgb_image); 

    return 0; 
} 

और यहाँ एक छवि लिखने के लिए कोड है:

g++ main.cpp 
:

#include <stdint.h> 

#define STB_IMAGE_WRITE_IMPLEMENTATION 
#include "stb_image_write.h" 

#define CHANNEL_NUM 3 

int main() { 
    int width = 800; 
    int height = 800; 

    uint8_t* rgb_image; 
    rgb_image = malloc(width*height*CHANNEL_NUM); 

    // Write your code to populate rgb_image here 

    stbi_write_png("image.png", width, height, CHANNEL_NUM, rgb_image, width*CHANNEL_NUM); 

    return 0; 
} 

आप झंडे या निर्भरता के बिना संकलन कर सकते हैं

अन्य हल्के विकल्पों में शामिल हैं:

  • lodepng पढ़ सकते हैं और PNG फ़ाइलें
  • jpeg-compressor लिखने के लिए पढ़ सकते हैं और जेपीईजी फ़ाइलें
+1

मुझे math.h लाइब्रेरी को शामिल करना था और संकलन करते समय इसे लिंक करना था (http://stackoverflow.com/questions/8671366/undefined-reference-to-pow-and-floor) या मुझे पाउ में एक अपरिभाषित संदर्भ मिलेगा छवि पुस्तकालय। –

+0

मुझे पता है कि यह सिर्फ एक उदाहरण है, लेकिन क्या आप स्पष्ट कर सकते हैं कि कोड में जादू संख्या 3 का क्या अर्थ है? – mattshu

+1

@mattshu यह चैनलों की संख्या (लाल, हरा, नीला) है, शायद मुझे इसे अपने कोड पर स्पष्ट करना चाहिए, मैं एक संपादन करूँगा। –

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