пиксельные данные opengl в jpeg

Доступны ли какие-либо примеры С++ для преобразования необработанных данных пикселей, полученных из glReadPixels, в формат JPEG и обратно?


person John Qualis    schedule 18.11.2010    source источник
comment
Почему на нем тег JPEG2000? JPEG и JPEG2K — совершенно разные звери.   -  person Goz    schedule 18.11.2010
comment
мы можем сделать это и в jpeg2k? Я никогда не использовал jpeg2k. Любые указатели?   -  person John Qualis    schedule 19.11.2010
comment
jpeg2k - это просто другой формат изображения с потерями. Делать то, что вы хотите, в jpeg2k будет так же, как и в любом другом формате, при условии, что выбранная вами библиотека поддерживает его (см. en.wikipedia.org/wiki/JPEG_2000 для списка поддерживаемых библиотек).   -  person mpenkov    schedule 20.11.2010


Ответы (3)


Вы можете использовать библиотеку ImageMagick для преобразования необработанных данных в данные изображения jpeg и наоборот. Используя ту же библиотеку, вы можете преобразовать данные изображения JPEG в необработанные (RGB) данные.

person BЈовић    schedule 18.11.2010

Используйте для этого внешнюю библиотеку.

Я рекомендую DevIL, швейцарский армейский нож номер один для работы с файлами изображений. Вам просто нужно

  • создать RGB-изображение в памяти через DevIL,
  • вызовите glReadPixels, чтобы заполнить изображение DevIL пикселями, считанными из кадрового буфера GL,
  • вызовите ilSaveImage("foo.jpg"), чтобы сохранить файл. Вы также можете использовать bmp, png и еще несколько — формат будет автоматически определен по имени файла.

Простой.

person Kos    schedule 18.11.2010

Я не уверен, поддерживает ли 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.

person mpenkov    schedule 18.11.2010
comment
Я думал может быть libjpeg. - person John Qualis; 18.11.2010
comment
Да, подойдет любая библиотека изображений. Это довольно рутинная вещь, поэтому я сомневаюсь, что код будет выглядеть сильно по-другому. - person mpenkov; 18.11.2010
comment
Я не смог найти функцию сжатия памяти в libjpeg. Существует ли какой-либо код С++, который отображается при сжатии/распаковке памяти (в отличие от записи в файл) - person John Qualis; 18.11.2010
comment
Вы можете сохранить изображение в файл, а затем прочитать его обратно в память, если хотите. Или, если вы действительно в отчаянии, вы можете каннибализировать код libjpeg, чтобы выставить закодированный битовый поток до того, как он будет записан в файл. Но зачем тебе это вообще? - person mpenkov; 20.11.2010
comment
Также взгляните на функцию imencode OpenCV: opencv.willowgarage.com/documentation/cpp/ - person mpenkov; 23.11.2010