2010-11-18 3 views
2

glReadPixels에서 가져온 원시 픽셀 데이터를 JPEG 형식으로 변환하고 다시 사용할 수있는 모든 C++ 예제?OpenGL 픽셀 데이터를 jpeg

+0

왜이 태그에 JPEG2000 태그가 있습니까? JPEG와 JPEG2K는 완전히 다른 짐승입니다. – Goz

+0

jpeg2k에서도이 작업을 수행 할 수 있습니까? 나는 jpeg2k를 사용한 적이 없다. 어떤 포인터? –

+0

jpeg2k는 손실이 많은 이미지 형식입니다. "jpeg2k"에서 원하는 작업을 수행하는 것은 사용하려는 라이브러리가이를 지원한다고 가정 할 때 다른 형식과 동일합니다 (지원 라이브러리 목록은 http://en.wikipedia.org/wiki/JPEG_2000 참조) . – misha

답변

2

ImageMagick 라이브러리를 사용하면 원시 데이터를 jpeg 이미지 데이터로 변환 할 수 있습니다. 동일한 라이브러리를 사용하여 jpeg 이미지 데이터를 원시 (RGB) 데이터로 변환 할 수 있습니다.

0

OpenGL에서 JPEG 이미지 처리를 지원하는지 잘 모르겠습니다. 도서관이 실제로하는 것이 아닙니다.

일단 픽셀 데이터에 액세스하면 쉽게 OpenCV을 사용하여 이미지를 JPEG (또는 다른 형식)로 쓸 수 있습니다. 여기에 의사 코드가 있습니다.

/* 
* On Linux, compile with: 
* 
* g++ -Wall -ggdb -I. -I/usr/include/opencv -L /usr/lib -lm -lcv -lhighgui -lcvaux filename.cpp -o filename.out 
*/ 

#include <cv.h>  
#include <highgui.h> 

/* 
* Your image dimensions. 
*/ 
int width; 
int height; 

CvSize size = cvSize(width, height); 

/* 
* Create 3-channel image, unsigned 8-bit per channel. 
*/ 
IplImage *image = cvCreateImage(size, IPL_DEPTH_8U, 3); 

for (int i = 0; i < width; ++i) 
for (int j = 0; j < height; ++j) 
{ 
    unsigned int r; 
    unsigned int g; 
    unsigned int b; 

    /* 
    * Call glReadPixels, grab your RGB data. 
    * Keep in mind that OpenCV stores things in BGR order. 
    */ 
    CvScalar bgr = cvScalar(b, g, r); 
    cvSet2D(image, i, j, bgr); 
} 

cvSaveImage("filename.jpg", image); 
cvReleaseImage(&image); 

주위를 둘러 보면 JPEG를 다루기위한 다른 라이브러리도 있습니다.

+0

나는 libjpeg일지도 모른다고 생각하고 있었다. –

+0

예, 모든 이미징 라이브러리가 수행합니다. 이렇게하는 것이 매우 일상적인 일이므로 코드가 많이 달라 보이는지 의심 스럽습니다. – misha

+0

libjpeg에서 메모리 압축 기능을 찾을 수 없습니다. 메모리 압축/압축 해제에 표시되는 모든 C++ 코드가 있습니까 (파일에 쓰는 것과 반대) –

1

외부 라이브러리를 사용하십시오.

이미지 파일 처리를 위해 스위스 군용 나이프 DevIL을 권합니다.

  • 가 악마를 통해 메모리에 RGB 이미지를 만드는 방법은 파일을 저장하려면 GL 프레임 버퍼에서 읽어내는 픽셀로 악마의 이미지를 채우기 위해,
  • 전화 ilSaveImage("foo.jpg")
  • 전화 glReadPixels 필요합니다. bmp, png 등을 사용할 수도 있습니다. 파일 이름에서 형식이 자동으로 감지됩니다.

심플.