2010-01-16 4 views
14

C/C++에서 이미지 파일을 읽어야합니다. 어떤 사람이 나를 위해 코드를 게시 할 수 있다면 매우 좋을 것입니다.C/C++에서 이미지 파일 읽기

나는 그레이 스케일 이미지에서 작동하며 이미지는 JPEG입니다. 이미지를 2D 배열로 읽어 내 작업을 쉽게하고 싶습니다. 사전

+0

libjpeg의 문서인가 (http://www.ijg.org/) 또는 읽기 및 쓰기 PNG 파일

  • jpeg-compressor를 읽고 쓰기 ? – greyfade

  • +1

    질문 한 세 가지 질문에 대한 정답을 선택하는 것을 잊지 마십시오. – mwcz

    답변

    2

    에서

    덕분에 CImg 라이브러리를 사용해보십시오. tutorial을 통해 친숙해질 수 있습니다. CImg 객체를 얻으면 data() 함수는 2D 픽셀 버퍼 배열에 대한 액세스를 제공합니다.

    +0

    실제로 그것은 4D 픽셀 매트릭스로 모델링됩니다. 2D 그레이 스케일 이미지는 깊이와 색상 치수를 1로 설정합니다. 후드에서 템플릿 유형 T의 1D 배열입니다. – jiggunjer

    +0

    CImg은 jpeg를로드하려면 libjpeg가 필요합니다. –

    12

    JPEG format을보고 나만의 글을 쓸 수 있습니다.

    그런데 CImg 또는 Boost's GIL과 같은 기존 라이브러리를 사용해보십시오. 또는 JPEG의 경우 정확히 libjpeg입니다. CodeProject에도 CxImage 클래스가 있습니다.

    여기는 big list입니다.

    +1

    Boost.GIL이 작동하지 않고 유지 관리되지 않습니다. – Tronic

    +1

    C가 허용 되었기 때문에 가장 가벼운 솔루션으로 libjpeg를 두 번째로 사용합니다. CImg과 GIL은 문법적으로 더 쉬울뿐 아니라 libjpeg도 필요합니다. CImg 개체의 데이터를 일부 STL 컨테이너 또는 배열로 쉽게 복사 할 수 있습니다. – jiggunjer

    +0

    CImg도 libjpeg의 BSD 라이센 스보다 훨씬 제한적인 LGPL과 같은 라이센스를 사용합니다. – 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++; 
    } 
    

    픽셀은 한 차원 배열이 될 것입니다,하지만 당신은 쉽게 1D 배열 위치에 주어진 x와 y 위치를 변환 할 수 있습니다. POS = (y를 * 폭)처럼 뭔가 + X

    3

    체크 아웃 인텔 열기 CV 라이브러리 ...

    5

    libpng/libjpeg 종속성이없는 최소한의 방법을 사용하기로 결정한 경우 stb_imagestb_image_write (here)을 사용하는 것이 좋습니다.

    간단히 말해서 헤더 파일 stb_image.hstb_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 네이티브 어떤 API 당신이 불충분 함이 JPEG 파일
    +1

    컴파일 할 때 math.h 라이브러리를 포함하고 링크해야했습니다 (http://stackoverflow.com/questions/8671366/undefined-reference-to-pow-and-floor). 또는 정의되지 않은 참조를 얻을 것입니다. 이미지 라이브러리 –

    +0

    예를 들어 알 수 있겠지만 마법 번호 3이 코드에서 의미하는 바를 명확히 할 수 있습니까? – mattshu

    +1

    @mattshu 채널 수 (빨강, 녹색, 파랑)입니다. 코드에서이를 분명히해야합니다. 편집을하겠습니다. –