2009-12-16 8 views
10

C++에서 이미지의 픽셀을 열고 읽는 방법? X, Y 형식으로 색을 읽으십시오.C++에서 이미지의 픽셀 읽기

+1

특정 이미지 형식을 사용하여 이미지 파일에서 픽셀의 색상을 읽기? 형식이 다르면 라이브러리가 다릅니다. –

+1

이미지의 형식은 무엇입니까? BMP? PNG? JPEG? –

+0

아마 JPG 또는 BMP. OpenGL에서 추출되므로 아직 확실하지 않습니다. 그게 그렇게 중요한 건가? 그렇다면 어떤 것이 더 낫습니까? –

답변

3

, 그것은 거의 모든 것을 갖추고 있습니다 이미지로 작업해야합니다.

OpenCV 2.0은 몇 달 전에 출시되었으며 C++과 매우 친숙합니다.

+4

OpenCV는 단지 이미지를 읽는 것보다 과잉입니다. –

+0

예, 큰 도서관입니다. 독서/작문 이외의 다른 일을하고 싶다면 옵션으로 사용하고 있습니다. 익숙해지면 좋을 것입니다. – rem7

5

DevIL (http://openil.sourceforge.net/)과 같은 라이브러리를 사용하십시오. DevIL은 이미지 데이터를 배열에로드하고 ilGetPixels() 등과 같은 함수를 사용하여 원시 픽셀 데이터에 액세스 할 수 있습니다.

DevIL도 OpenGL을 지원합니다.

+0

s/ilGetPixels()/ilGetData() –

2

BMP는 놀라 울 정도로 간단합니다. 압축되지 않은 BMP는 헤더, BMP에 대한 정보, 컬러 팔레트 (해당되는 경우) 및 비트 맵 데이터로 구성됩니다 (픽셀 단위). 8 비트, RLE 압축 등 모든 기능을 처리하는 많은 추가 작업이 있지만 자신의 비트 맵 파서를 작성하는 것은 재미있는 일입니다.

가장 좋은 방법은 라이브러리를 사용하는 것입니다. Image Magick에는 거의 모든 이미지 형식을 열고 픽셀에 액세스 할 수있게 해주는 C 라이브러리가 있습니다. SDL_image은 사용하기 쉽고 SDL을 OpenGL과 함께 쉽게 사용할 수있는 또 다른 라이브러리입니다.

사용해야하는 이미지 형식은 응용 프로그램에 따라 다릅니다. JPG는 꽤 좋은 압축률을 가지고 있지만, 압축은 LOSSY입니다. 이미지에 텍스트가 있거나 단색 또는 가장자리가 넓은 영역 (예 : 만화)이 좋지 않은 경우 눈에 띄는 유물이 생성됩니다. 사진의 경우 일반적으로 JPG가 좋습니다. PNG는 훌륭한 대안이지만 압축은되지만 압축은 LOSSLESS입니다. JPG는 일반적으로 PNG보다 작을 것이며, 둘 다 BMP보다 작을 것입니다.

4

기존 라이브러리를 사용하거나 직접 코드를 작성하십시오. 일반적으로 이미지 파일 형식이 표면에 보이는 것보다 더 복잡하기 때문에 첫 번째 방법이 더 좋습니다. 조심하지 않으면 이미지가 거꾸로되거나 색상 구성 요소 순서가 잘못 될 수 있습니다.

요구 사항에 따라 형식의 기능을 고려해야 할 수도 있습니다. 높은 동적 범위에 대한 지원이 흥미로운 경우 OpenEXR은 훌륭한 선택입니다. PNG와 같이 다른 프로그램 중에서 큰 지원을받지 못하기 때문에 불편할뿐입니다.

가 여기에 내가 자주 이미지를 읽고 쓸 필요로 할 때 켜 두 라이브러리입니다 libpng, 당신이 OpenCV의 라이브러리로 보일 것 이미지와 함께 일하기 위하여려고하는 경우에 OpenExr

+0

우리는 이미지 생성에 libpng를 사용합니다. 정말 사용하기 쉽고 순수한 C++ 코드이므로 진절머리 나는 인터페이스를 다룰 필요가 없습니다. –

+1

@Matthieu M .: libpng은 "순수 C++"로 작성되지 않았습니다. 그것은 Laserallan에 의해 링크 된 페이지에 명시된대로 C89로 작성되었습니다. – unwind

5

Magick++ 라이브러리

#include <Magick++.h> 
#include <iostream> 

using namespace Magick; 
using namespace std; 

int main(int argc, char **argv) { 
try { 
    InitializeMagick(*argv); 
    Image img("C:/test.bmp"); 
    ColorRGB rgb(img.pixelColor(0, 0)); // ie. pixel at pos x=0, y=0 
    cout << "red: " << rgb.red(); 
    cout << ", green: " << rgb.green(); 
    cout << ", blue: " << rgb.blue() << endl; 
} 
    catch (Magick::Exception & error) { 
    cerr << "Caught Magick++ exception: " << error.what() << endl; 
} 
return 0; 
}