Някакви налични C++ примери за конвертиране на необработени пикселни данни, получени от glReadPixels в JPEG формат и обратно?
opengl пикселни данни в jpeg
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
Мислех си, че може да е libjpeg.
- person John Qualis; 18.11.2010
Да, всяка библиотека с изображения ще свърши работа. Това е доста рутинно нещо, така че се съмнявам, че кодът ще изглежда много по-различно.
- person mpenkov; 18.11.2010
Не можах да намеря никаква функция за компресиране на паметта в libjpeg. Съществува ли някакъв c++ код, който се показва при компресия/декомпресия на паметта (за разлика от запис във файл)
- person John Qualis; 18.11.2010
Можете да запишете изображението във файл и след това да го прочетете обратно в паметта, ако наистина искате. Или, ако сте наистина отчаяни, можете да канибализирате кода на libjpeg, за да разкриете кодирания битстрийм, преди да бъде записан във файл. Но все пак защо бихте искали това?
- person mpenkov; 20.11.2010
Освен това разгледайте функцията imencode на OpenCV: opencv.willowgarage.com/documentation/cpp/
- person mpenkov; 23.11.2010