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

Някакви налични C++ примери за конвертиране на необработени пикселни данни, получени от 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 framebuffer,
  • обадете се на 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. Съществува ли някакъв c++ код, който се показва при компресия/декомпресия на паметта (за разлика от запис във файл) - 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